SVN taahhüdünü nasıl geri alabilirim?


303

Bir SVN taahhüdünün nasıl geri alınacağına dair çeşitli örnekler buldum

svn merge -r [current_version]:[previous_version] [repository_url]

veya

svn merge -c -[R] .

Ama ikisi de işe yaramıyor. Bu komutları denedim ve elle değiştirilen dosyaları kontrol ettim.

1944 numaralı revizyon ile nasıl bir taahhütte bulunabilirim? Geri dönmenin yapılıp yapılmadığını nasıl kontrol edebilirim (değişikliklerin gerçek dosyasına bakmadan geri döndürülmüş olabilir)?


16
Hiçbiri işe yaramadığı için bir cevap kabul etmediniz mi?
2rs2ts

4
Gerçek bir cevap istiyorsanız "svn merge -c -1944" kullanın. Çalışıp çalışmadığını kontrol etmek için: "svn diff"
John Sampson



Ne durumda, 1943 (iyi taahhüt), sonra 1944 (kötü taahhüt), sonra 1945 (iyi taahhüt), sonra 1946 (iyi taahhüt) var. Şimdi sadece 1944'ü kaldırmak (kötü taahhüt) ve 1944'ten sonra tüm revizyonu tutmak istiyorum, bu revizyondan 1943,1945,1946 (sadece 1944'ü kaldırın) gibi bir sonuç istiyorum, ne yapmalıyım?
Bhavin_m

Yanıtlar:


448

Her iki örnek de işe yarıyor olmalı, ancak

svn merge -r UPREV:LOWREV . aralığı geri al

svn merge -c -REV . tek düzeltmeyi geri al

bu sözdiziminde - geçerli yön WC ise ve (her birleşmeden sonra yapılması gerektiği gibi) sonuç alırsınız

Günlükleri görmek ister misiniz?


9
@dwjohnston - evet, birleştirmeler her zaman WC'de gerçekleştirilir ve sunucu tarafı görevi değildir
Lazy Badger

14
svn: Merge source required. Nafile.
2rs2ts

27
@ 2rs2ts, 'geçerli dizinde bunu yap' belirtmek için son noktayı unuttuğunuz anlaşılıyor.
Dalin

14
ayrıca aynı anda birden fazla taahhütte bulunabilirsiniz:svn merge -c -42587,-42589 .
14'te

1
@ahnbizcad - geri almak istediğiniz revizyon (tekli)
Lazy Badger

130

TortoiseSVN istemcisini kullanıyorsanız, Günlüğü Göster iletişim kutusundan kolayca yapılır .


5
Bu, bunu yapmanın en kolay yoludur
Markku K.

5
Bu modası geçmiş. Geçerli sürümde istemci için artık bir Bağlam Menüsü yoktur.
user1789573

19
Ne? TortoiseSVN, bir bağlam menüsü ve ayrıca ortaya çıktığı iletişim kutularıdır. "Artık bir içerik menüsü yok" ile ne demek istiyorsun? Kesinlikle var!
Ben

@ Ben Ben user1789573 cevabında bağlantılı öğretici "Bağlam Menüsü" açık söz biraz üzerinde takılıyordu düşünüyorum.
Tom Catullo

2
Bunu daha sonra görüyorsanız, (hala) oradadır. Günlük kaydını göster ekranında, düzeltmeyi sağ tıklayın ve "Bu Düzeltmeye Geri Dön" seçeneği var. Bu TortoiseSVN 1.9.4 Build 27285'te. Sadece kullandım ve size iyi çalıştığını söyleyebilirim.
Bruce Van Horn

65

svn merge -r 1944:1943 .çalışma kopyanızdaki r1944 değişikliklerini geri almalıdır. Daha sonra, çalışma kopyanızdaki değişiklikleri (diff ile) inceleyebilirsiniz, ancak geri dönüşü depoya uygulamak için taahhütte bulunmanız gerekir.


4
Çalışmaz, birleştirme kaynağı gerektirir. svn merge -r 1944:1943 .Bunun yerine denedim , ama hiçbir şey değişmedi.
Alex

Depo 1944'ten beri gelişmiş mi? Öyleyse, r1943 ve r1944 arasındaki değişikliklerle aynı satırlarda çelişkili değişiklikler var mı?
onon15

1945 revizyonundayım ve bir çatışma yok gibi görünüyor. Ne svn statusde ne bir svn diffşey verir.
Alex

7
Hata:svn: Try 'svn help' for more info svn: Merge source required
Alex

5
Ama svn merge -r 1945:1943 .işe yaramış gibi görünüyor. Sanırım anlıyorum: Sürümü 'kötü' işlemden önceki sürümü çalışma havuzunuzda birleştirmeniz gerekiyor. Önceki taahhüdün basit bir 'geri' yapmak istediğinizde bu Tamam. Peki ya 1900 sürümü ile yapılan değişiklikleri geri almak isterseniz?
Alex

45

İlk olarak, çalışma kopyasını 1943'e döndürün.

> svn merge -c -1943 .

İkincisi, ne işleneceğini kontrol edin.

> svn status

Üçüncüsü, taahhüt 1945 sürümü.

> svn commit -m "Fix bad commit."

Dördüncüsü, yeni günlüğe bakın.

> svn log -l 4

------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line

Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line

This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line

This was a good commit.
------------------------------------------------------------------------

1
Ne durumda, 1943 (iyi taahhüt), sonra 1944 (kötü taahhüt), sonra 1945 (iyi taahhüt), sonra 1946 (iyi taahhüt) var. Şimdi sadece 1944'ü kaldırmak (kötü taahhüt) ve 1944'ten sonra tüm revizyonu tutmak istiyorum, bu revizyondan 1943,1945,1946 (sadece 1944'ü kaldırın) gibi bir sonuç istiyorum, ne yapmalıyım?
Bhavin_m

26

Bir revizyonu "devre dışı bırakmak" mümkün değildir, ancak çalışma kopyanızı 1943 sürümüne geri döndürebilir ve bunu 1945 sürümü olarak uygulayabilirsiniz. 1943 ve 1945 sürümleri aynı olacak ve değişiklikleri etkili bir şekilde geri alacaktır.


18
Sadece can sıkıcı bir şekilde doğru olmak için, depoya yönetici erişiminiz varsa, "hizmetten çıkabilirsiniz". Bunu kullanarak svn dumpve sonra verilen bir revizyona kadar bir klon deposu oluşturarak svn load. Ancak, elbette, bu normal koşullarda kullanılmamalıdır.
onon15

4
Taahhüt etmek istemiyorum, belirli bir taahhüt tersine çevrilmiş yeni bir taahhüt numarası oluşturmak istiyorum. Setler, 1944 versiyonunu kontrol ettiğimi, 1945'te 'geri dönmek' istediğim bir taahhütte bulunduğumu söylüyor. Sonra dosyaları 1944 sürümü ile aynı olan bir 1946 sürümüne sahip olmak istiyorum. (Elbette tarihi hariç). Komutlar nelerdir?
Alex

//, @Alex, ben de ilgileniyorum, özellikle benzer bir şey $ git revert. Git'i bu kadar uzun süre kullandıktan sonra SVN öğrenmeyi biraz zor buldum.
Nathan Basanese

10

Aşağıdaki gibi, kuru bir koşu yapacak. HEAD geçerli sürüm, PREV önceki, ardından dosyanızın yolu veya taahhüt edilen öğe:

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

Kuru çalışma iyi görünüyorsa, komutu --dry-run olmadan çalıştırın

Düzeltmedeki değişikliği doğrulayın ve yeniden taahhüt edin. Sürüm numaralarına göz atmak için şunları deneyin:

svn log

4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F

Bu, yerel kopyanın hatalı düzeltmeden farklı olmasını gerektiriyor mu?
Eliezer Miron

2

Alex, şunu dene: svn merge [WorkingFolderPath] -r 1944: 1943


2

Verilen öneriler bazı insanlar için zaten işe yarayabilir, ancak benim durumum için işe yaramıyor. Birleştirme işlemini gerçekleştirirken, adresinde rev 1443güncelleme yapan kullanıcılar, rev 1445eşitlenmiş 1444olsalar bile değiştirilen tüm dosyaları senkronize eder1443 . Güncellemeyi hiç görmemek için son kullanıcılara ihtiyacım vardı.

Taahhüdü tamamen gizlemek istiyorsanız, doğru revizyonda yeni bir şube oluşturarak ve ardından dalları değiştirerek mümkündür. Tek şey, tüm kilitleri kaldırmanız ve yeniden eklemeniz gerektiğidir.

copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>

Bu benim için çalıştı, belki orada başka birine yardımcı olacaktır =)


2
svn merge -c -M PATH

Bu hayatımı kurtardı.

Aynı sorunu yaşıyordum, geri döndükten sonra da eski kodu görmüyordum. Yukarıdaki komutu çalıştırdıktan sonra temiz bir eski sürüm kodu aldım.


1

Yukarıda denedim, ( svn merge) ve haklısın, jack. ancak

svn update -r <revision> <target> [-R]

çalışıyor gibi görünüyor, ancak kalıcı değil (svn'm sadece eski bir revizyon gösteriyor). Bu yüzden yapmak zorundaydım

mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>

Benim özel durumumda hedefim interfaces/AngelInterface.php. Dosyada değişiklik yaptım, bunları taahhüt ettim, phpdoc derleyicisini çalıştırıp bilgisayarımın güncellendiğini ve değişikliklerimin zaman kaybı olduğunu gördüm. svn log interfaces/AngelInterface.phpdeğişiklikimi r22060 olarak gösteriyor ve bu dosyadaki önceki işlem r22059'du. Böylece ben svn update -r 22059 interfaces/AngelInterface.phpve ben tekrar -r22059 olduğu gibi kod ile bitirmek. Sonra :-

mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php

Alternatif olarak , yukarıda belirtilenlerin . -Ryerine , aynı şeyi bir dizinde de yapabilirim interfaces/AngelInterface.php.


1
Daha önce de söylendiği gibi, yapamayacağınız şey, taahhüdü geçmişten kaldırmaktır, tıpkı git'te doğrudan ref'leri hackleyerek yapabilirsiniz. Tek yapabileceğiniz, kaynağınızı nasıl istediğiniz şekilde değiştirmek ve bunu bir değişiklik olarak işlemek için depoyu kullanmaktır.
sibaz

Daha fazla araştırma yaptıktan sonra, svnadmin kullanarak taahhüdü geçmişten kaldırmanın mümkün olduğunu görebiliyorum, ancak buna karşı şiddetle tavsiye edilirsiniz. Bkz. Stackoverflow.com/questions/5566327/…
sibaz

0

Taahhütleri geçmişten tamamen kaldırmak istiyorsanız, belirli bir revizyonda repo dökümü de yapabilir, ardından bu dökümü içe aktarabilirsiniz. özellikle:

svnrdump dump -r 1:<rev> <url> > filename.dump

Svnrdump komutu, svnadmin dökümü ile aynı işlevi yerine getirir, ancak uzak bir depoda çalışır.

Sonra döküm dosyasını istediğiniz repo dosyasına aktarın. Bu, Beanstalk üzerinde iyi çalıştığı test edildi.

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.