Bir dosyanın önceki SVN revizyonuna geri dönmenin daha iyi bir yolu var mı?


167

Bir SVN deposuna yanlışlıkla çok fazla dosya işledim ve kastetmediğim bazı şeyleri değiştirdim. (İç çeker.) Onları önceki hallerine döndürmek için, karşılaşabileceğim en iyi şey

svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

Tanrım! Daha iyi bir yol yok mu? Neden böyle bir şey yazamıyorum:

svn revert -r 854 l3toks.dtx

Tamam, ben sadece v1.4.4 kullanıyorum, ama 1.5 dalı için değişiklik listesi üzerinden geçtim ve bununla doğrudan ilgili hiçbir şey göremedim. Bir şey mi kaçırdım?


Edit: Ben yeterince açık değildi sanırım. Sonra ben o değişiklikleri kaybedeceksiniz çünkü ben birleştirme ters istiyorum sanmıyorum did yapmak istiyorum! Söyleyin fileAve fileBher ikisi de değiştirildi ama sadece taahhüt etmek istedim fileA; yanlışlıkla yazarak

svn commit -m "small change"

her iki dosyayı da işler ve şimdi geri almak istiyorum fileB. Ters birleştirme, bu görevi yukarıda açıkladığım adımlardan daha kolay (anlayabildiğim kadarıyla) yapar.


Yanıtlar:


243
svn merge -r 854:853 l3toks.dtx

veya

svn merge -c -854 l3toks.dtx

İki komut eşdeğerdir .


5
Bunun için teşekkürler sadece devlet şey istedim - diyelim ki ben revizyon 855 de değilim, ben yaparsanız revizyon 854. Bir dosyayı geri döndürmek istiyor svn merge -c -854 my.fileve ardından yapılacak svn diff, bir revizyon gösteriyor gibi önce 854 (olduğunu 853 ); sadece svm merge -c 854 myfile(olmadan -) yaptığımda , dosyam rev4 854'e geri döndürülmüş gibi görünüyor. Tekrar teşekkürler, şerefe!
sdaau

11
Yukarıdaki ilk seçeneğin benim için bir cazibe gibi çalışmasının bir nedeni var mı, ikincisi TÜMÜNDE çalışmadı mı?
skybondsor

7
Yine de ters birleştirmeden sonra taahhüt etmeyi unutmayın. Sık sık unuturum :)
Vineeth Pradhan

11
Gerçekten, bu iki komut arasındaki farkın ne olduğunu belirtmediği için eksi 1 olmalıdır. Kötü cevap
Angry Dan

4
@sprog - Bilmekten memnun olduğum bir fark varsa
orip

34

Svn kitabının " değişiklikleri geri alma " bölümüne göz atın


5
Dış kaynaklara bağlantılar teşvik edilir, ancak lütfen kullanıcılarınızın ne olduğunu ve neden orada olduğunu bilmeleri için bağlantının çevresine bağlam ekleyin. Hedef siteye erişilemiyorsa veya kalıcı olarak çevrimdışı olursa, her zaman önemli bir bağlantının en alakalı kısmını belirtin.
user2084795

32

daha önce verilen cevabın tekrarı için biraz yer kullandığım için üzgünüm - ama bu her zaman başıma bela olan bir şey.

Diyelim ki yerel dosyaları en son revizyona güncelledim, ki bu 854'tür. Daha sonra, daha eski bir revizyon almak istiyorum - birkaç revizyondan önceki dosyanın versiyonu, revizyon 851 diyelim.

Kopyalama işe yarar:

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

.. Ancak, repo URL için selamlamak rahatsız olamaz :)

Güncelleme görünüşte işe yarayabilir:

svn up -r 851 ./l3toks.dtx

... ancak aynı zamanda yerel kopyayı "yeni kullanıma alınmış" veya daha çok "çevrimiçi revizyonla" olarak işaretler (yani Tortoise / RabbitVCS'de yeşil bir Tamam onay işareti alırsınız) - bu, yapamayacağınız anlamına gelir svn ci -m "rolled back to r 851": subversionyürütülebilir dosya yerel değişiklikleri fark etmez ve çevrimiçi veri havuzuna hiçbir şey yüklemekten rahatsız olmaz.

Ve daha önce yanıtlandığı gibi, ters birleştirme çalışır - ancak bu durumda, kısayol sözdizimine güvenilmemelidir; ancak özellikle belirtin:

svn merge -r HEAD:851 l3toks.dtx
--- Reverse-merging r854 through r852 into 'l3toks.dtx':
U    l3toks.dtx

Itiraf etmeliyim - Ben cümleyi bunuanlayamaz " Ters-birleştirme dosyası içine r852 yoluyla r854 " "anlamında Sadece dosyanın r851 var ve daha önce yerel vardı ne olursa olsun üzerine yazılır - ve en son çevrimiçi revizyon farklı olarak işaretli olduğu için yeni bir 'geri alma' revizyonu olarak tekrar çevrimiçi olarak kontrol edebilirsiniz , ancak sanırım (ve umarım :)) işte budur :)

Bundan sonra svn diff, doğru revizyonu yerel olarak geri alırsak hızlı bir emin olmak için kullanılabilir ; ve ayrıca, dosya Tortoise / RabbitVCS'de (yani en son taahhüt edilen sürümden farklı olarak) kırmızı bir ünlem işaretiyle işaretlenir ve svn ci -m "rolled back to r 851"bu kez çalışabilir.

Ayrıca, nihayet, ters birleştirme işleminden sonra fikrinizi değiştirirseniz ( yani, en son, HEAD revizyonu, burada 854), yerel olarak 851'e geri döndükten sonra, ancak geri dönmeyi taahhüt etmediyseniz, ), kullanmamalısınız svn up, çünkü basitçe "zaten 854 revizyonunda " olduğunu söyleyecektir ; bunun yerine svn revert --recursive .veya benzerlerini kullanın ...

Şerefe!

Ref: Subversion - Jacob Wright - Flex, AIR, PHP, vb.

EDIT: ... ve görünüşe göre, tam olarak aynı etki svn merge -r HEAD:851 l3toks.dtxile elde edilebilir:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.

2
DAİMA svn dışa aktarmayı tercih etmelisiniz, çünkü tam olarak ne istediğinizi yapar - belirli bir revizyonda bir Dosyaya göz atın, ters Birleştirme de yerel değişikliklerinizi belirtilen sürümle birleştirmeye çalışacaktır, bu karmaşık ve çılgın bir işlemdir. dikkat etmezseniz hatalara eğilimli!
Falco

1
Ters birleştirme ile ilgili sorunlar yaşadım. Neden olduğunu anlamak yerine, sadece ihracat denedim ve mükemmel çalıştı. Sadece ihracat kullanarak tavsiye. --forceDizinlerin üzerine yazmak için kullanabilirsiniz . Sadece değişikliklerin üzerine yazacağını unutmayın.
Nick

Gerçekte ne olduğu hakkında çok iyi bir açıklama! AnkhSVN ve TortoiseSVN'yi sık sık kullanıyorum ve kullanmak için hiçbir yer görmüyorum svn export- bir şey eksik mi yoksa bu GUI'lerde uygulanmadı mı?
Conrad

@Conrad, Depo bağlam (sağ tıklama) menünüzden
AnkhSVN'de

10

Son zamanlarda eski bir yapıda hata ayıklamak için belirli bir revizyona geri dönmek zorunda kaldım ve bu sihir gibi çalıştı:

svn up -r 3340 (or what ever your desired revision number)

Yerel değişiklikleri umursamadım olarak "tc" seçeneğini kullanarak tüm çakışmaları çözmek zorunda kaldım (geri dönmeden önce önem verdiğim her şeyi kontrol ettim)

Tekrar gözden geçirmeye geri dönmek de basitti:

svn up

5

Aradığınız şeye "ters birleştirme" denir. SVN kitabındaki birleştirme işleviyle ilgili belgelere başvurmalısınız (luapyad olarak veya daha doğrusu bu yayındaki ilk yorumcu işaret eder). Tortoise kullanıyorsanız, günlük görünümüne gidip sağ tıklayıp hatayı yaptığınız "değişiklikleri" bu revizyondan geri al "seçeneğini belirleyebilirsiniz.


4

Ters birleştirme tam olarak istediğiniz şeydir (bkz. Luapyad'ın cevabı). Birleştirme, tüm dizin yerine hatalı olarak işlenen dosyaya uygulanır.


4

Yalnızca son check-in işlemini geri almak istiyorsanız, aşağıdakileri kullanabilirsiniz

svn merge -r head:prev l3toks.dtx

Bu şekilde, mevcut ve önceki sürüm numaralarını aramak zorunda kalmazsınız.


4

svn birleştirme revizyonları birleştirir, geri döndürmez. yani HEAD sürümünüzde bir miktar ekleme varsa, bunu önceki bir revizyonla birleştirin, o zaman değişiklik devam edecektir.

Svn cat kullanın ve sonra dosyaya yönlendirmek:

svn cat -r 851 l3toks.dtx > l3toks.dtx

Daha sonra bu dosyada 851 içeriğe sahipsiniz ve tekrar kontrol edebilirsiniz.


3

Eğer kullanırsanız Eclipse IDE ile SVN eklentisi aşağıdaki gibi yapabilirsiniz:

  1. Geri almak istediğiniz dosyaları (veya içerdikleri klasörü, yanlışlıkla yanlışlıkla sildiyseniz ve geri eklemek istiyorsanız) sağ tıklayın.
  2. " Takım> Geçiş " i seçin
  3. "Revizyon" radyon düğmesini seçin ve geri dönmek istediğiniz düzeltme numarasını girin. Tamam'ı tıklayın
  4. Senkronize et perspektifine gidin
  5. Geri almak istediğiniz tüm dosyaları seçin
  6. Seçimi sağ tıklayın ve " Geçersiz kıl ve Tamamla ... "

Bu, dosyaları istediğiniz revizyona döndürecektir. SVN'nin değişiklikleri yeni bir taahhüt olarak göreceğini unutmayın. Yani, değişiklik yeni bir revizyon numarası alır ve eski revizyon ile yeni revizyon arasında bir bağlantı yoktur. İşleme yorumlarında, bu dosyaları belirli bir düzeltmeye geri döndürdüğünüzü belirtmeniz gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.