Subversion'daki kodumuzun eski bir sürümüne nasıl geri dönebilirim?


486

Bir arkadaşıyla bir proje üzerinde çalışıyorum ve kodumuzun eski bir sürümüne dönmek ve geçerli olarak ayarlamak istiyorum. Nasıl yaparım?

Vs08 üzerinde "anksvn" kullanıyorum.

Bilgisayarımda istediğim sürüme sahibim, ancak taahhüt başarısız oluyor; Aldığım ileti "taahhüt başarısız, dosya veya dizin güncel değil."

Bilgisayarımda subversion istemcim de var.

Yanıtlar:


783

Temel olarak "birleştirme ters takmış" gerekir - Mevcut ve önceki versiyonu arasında bir diff uygulamak için geçerli sürüm ve yeniden işlemek (bir çalışma kopyası eski versiyonu gibi bakıyor ile bitirmek böylece). Örneğin, revizyon 150'den (mevcut) revizyon 140'a geri dönmek için:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

Subversion Red Book'un bu konuda iyi bir bölümü var .


3
ancak birleştirme değişikliklerimi ve yeni düzeltmeyi geçersiz kılmaz.
Chen Kinnrot,

76
TortoiseSVN kullanıyorsanız, Birleştir'i seçin, ardından Bir dizi Düzeltmeyi Birleştir'i seçin. Günlük kutusuna 140-150 yazın ve Reverse Checkbox'ı tıklayın. Bundan sonra, her zamanki gibi taahhüt edin. Bu, Jon örneğiyle aynı işlemi gerçekleştirecektir.
DavGarcia

8
Eclipse ve subclipse ile projenizi sağ tıklayıp Team / Show History'yi seçebilir, ardından "geri almak" istediğiniz revizyonları seçebilir ve başka bir sağ tıklamayla "Seçili Revizyonlardan Değişiklikleri Geri Al" seçeneğini belirleyebilirsiniz.
fego

36
Kafa revizyonundan geri dönmek için de yazabilirsiniz svn merge -r HEAD:140.
sschmeck

3
@ DavGarcia'nın TortoiseSVN talimatları benim için doğru değildi, en azından bir revizyondaki tüm dosyaları geri almamak (TortoiseSVN 1.8.8 kullanarak). Klasöre sağ tıklayın, TortoisSVN-> Günlüğü göster'i seçin. Geri almak istediğiniz düzeltmeleri seçin, "Bu düzeltmeden değişiklikleri geri al" dediği gibi sağ tıklayın. Değişiklikleri yapın.
mhenry1384

178

Yalnızca alt sürüm geçmişinin başında yeni değişiklikler yapabilirsiniz .

PC'nizdeki iyi kopyayla doğrudan hiçbir şey yapamamanızın nedeni, .svnklasörlerinin geçmişten kod olduğunu bilmesidir, bu yüzden herhangi bir taahhütten önce bir güncelleme gerektirir.

İyi revizyon numarasını bulun ve geri dönün

  1. İstediğiniz eski kopyanın revizyon numarasını bulun.

    Şu anki revizyonunuzu alın :

    svn info --show-item revision
    # or
    svn log
    

    Veya projenizin eski sürümlerini kontrol etmek için şunu kullanın:

    svn update -r <earlier_revision_number>

    Doğru revizyon numarasını bulana kadar.

  2. İyi revizyon numarasını not edin ( 123aşağıdaki örnekler varsayalım).

  3. En son revizyona güncelleyin:

    svn update
  4. İstediğiniz düzeltme ile en son sürüm arasındaki tüm değişiklikleri geri alın:

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"
    

    (Jon Skeet'in yukarıdaki cevabı ile aynı.)

Düzeltme numarasını bulamazsanız

Eski kopyayı bulamıyorsanız ve şu anda PC'nizde bulunan dosyaları yürütmek istiyorsanız:

  1. İyi sürümünüzün bir kopyasını oluşturun (ancak herhangi bir .svnklasör olmadan ):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
    
  2. Şimdi en son sürüme sahip olduğunuzdan emin olun:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
    
  3. İyi sürümünüzü çalışan kopyanın üstüne kopyalayın.

    Bu komut, çalışma ağacınızdaki iyi kopyanızda olmayan tüm dosyaları kopyalar ve siler, ancak mevcut .svnklasörleri etkilemez .

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/
    

    Rsync'iniz yoksa kullanabilirsiniz, cp -aancak istenmeyen dosyaları el ile de silmeniz gerekir.

  4. Şimdi sahip olduklarınızı yerine getirebilmelisiniz.

    cd project
    svn commit "Reverted to good copy"
    

2
svn bunu bir değişiklik olarak yorumlamıyor, bunu yapamam.
Sandburg

svn merge -r KAFA: 12345. geri almak için doğru komuttur, bir güncelleme yapmayın -r. Seni deli biri.
Baykuş

Sanırım bu cevap, revizyon numaralarını bulamayan veya önde gelen açıklamayı takdir eden insanlar tarafından onaylandı. Cevabı şimdi her iki yaklaşımı da içerecek şekilde güncelledim.
joeytwiddle

36

Sadece bu satırı kullan

svn update -r yourOldRevesion

Mevcut revizyonunuzu kullanarak şunları öğrenebilirsiniz:

svn bilgisi


15
Bu sorunu çözmez. Bunun yerine, bu, soruyu sorma sırasında askerin bulunduğu durumu üretir.
Ingo Schalk-Schupp

1
Bu tavsiyeye uyabilecek kadar talihsizseniz, "svn resol --accept working -R."
Baykuş

27

Tüm check-in işlemlerini geri almak için birleştirme yöntemini kullanmanın standart yolu mükemmeldir, eğer yapmak istediğiniz buysa. Bununla birlikte, bazen, tek yapmak istediğiniz tek bir dosyayı geri almaktır. Bunu yapmanın meşru bir yolu yok, ama bir hack var:

  1. Svn günlüğünü kullanarak istediğiniz sürümü bulun.
  2. Svn'nin dışa aktarma alt komutunu kullanın:

    svn dışa aktarma http: // url-to-to-file @ 123 / tmp / dosyaadı

(123, dosyanın iyi bir sürümünün revizyon numarasıdır.) Ardından eskisinin üzerine yazmak için bu tek dosyayı taşıyın veya kopyalayın. Değiştirilmiş dosyayı teslim edin ve işlem tamam.


Tortoise-svn kullanarak Tek bir dosyayı sağ tıklatıp birleştirebilirim. Bunu da kullanmanın bir yolu olmalı svnmı?
Ic.

10
svn cat -r 123 path-in-your-working-copy > path-in-your-working-copy
dash17291

8

Biraz daha eski okul

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

o zaman olağan

svn diff
svn commit

5

Bunun en uygun olduğunu düşünüyorum:

Birleştirmeyi geriye doğru yapın, örneğin, işlenen kod rev 5612'den 5616'ye revizyon içeriyorsa, geriye doğru birleştirin. Sonunda çalışıyor.

Örneğin:

svn merge -r 5616:5612 https://<your_svn_repository>/

Önceki revizyona kadar birleştirilmiş bir kod içerecektir, o zaman bunu taahhüt edebilirsiniz.


3

Benim için yaptım ve çalıştım.

Belirli zamanlarda yaptığım çoklu taahhütlerdeki değişiklikleri geri almak istiyorum ve önceki taahhüt noktasına gitmek istiyorum.

  1. Takım -> Geçmişi Göster'e gidin.
  2. Yoksaymak istediğiniz düzeltmeleri veya düzeltme aralığını sağ tıklayın.
  3. "Değişiklikleri geri al" seçeneğini belirtin.

Bu işlem ters kopya birleştirerek çalışma kopyanızdaki değişiklikleri geri alır.

Sadece kodu gözden geçirin ve taahhüt edin.


2

Geri almak istediğiniz en yüksek hiyerarşiye sağ tıklayın >> RevertveyaRevert to Revision


2

Önceki cevapların çoğu ters birleştirme kullanıyordu ve bu genellikle doğru cevaptı. Ancak, olmayan bir durum var (ki bu benim başıma geldi).

Küçük bir değişiklik yaparken yanlışlıkla DOS satır sonlarına Unix satır sonları ile bir dosyayı değiştirdim ve bunu taahhüt. Bu, satır sonlarını değiştirerek ve tekrar işleyerek ya da ters birleştirmeyle kolayca geri alınır, ancak svn blamelistemi düzenlemeyi dosyanın her satırının kaynağı olarak yapma etkisi vardır . (İlginçtir, Windows'daki TortoiseSVN bundan etkilenmez; sadece komut satırı svn blame.)

Geçmişi tarafından bildirildiği gibi korumak istiyorsanız svn blame, aşağıdakileri yapmanız gerektiğini düşünüyorum:

  • Dosyayı silin ve kesin.
  • Havuzda, dosyanın önceki iyi kopyasını kafasına kopyalayın ve taahhüt edin.
  • Saklamak istediğiniz düzenlemeleri geri yükleyin.

Silme işlemi biraz korkutucu, ancak dosyayı her zaman depoya kaydettiğinizi unutmayın, bu nedenle geri yükleme büyük bir sorun değildir. Adımları gösteren bazı kodlar. Bunun xxxson iyi kopyanın revizyon numarası olduğunu varsayalım .

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

Depodaki bir kopya için, hedefin bir dosya adı değil, bir dizin olması gerektiğini unutmayın.


1

Projeyi sağ tıklayın> Şununla Değiştir> Düzeltme veya URL> Geri almak istediğiniz düzeltmeyi seçin.

Şimdi yerel güncelleme kodu sürümünü depoya verin. Bu, kod tabanını belirli bir düzeltmeye geri döndürecektir.


1

Bu sayfada birçok tehlikeli cevap var. SVN 1.6 sürümünden bu yana, bir güncelleştirme -r yapmanın, ağaç çakışmalarına ilişkin bilgi için googling yaptığınız potansiyel olarak veri kaybetme kafkeresque kabusuna dönüşen ağaç çakışmalarına neden olabileceğini unutmayın.

Bir sürüme geri dönmenin doğru yolu:

svn merge -r HEAD:12345 .

Burada 12345 sürüm numarasıdır. Noktayı unutma.


0

Eski sürüme senkronize edin ve uygulayın. Bu hile yapmalı.

İşte ayrıca değişiklikleri geri dair bir açıklama.


0

Jon Skeet'in cevabı neredeyse kısaca çözümdür, ancak benim gibi iseniz, bir açıklama isteyebilirsiniz. Subversion kılavuzu bunu bir

Kiraz Toplama Birleştirme

Adam sayfalarından.

  1. Bu forma 'kiraz toplama' birleştirme denir: '-r N: M' kaynak dalı tarihinin N ve M revizyonları arasındaki farkı ifade eder.

    Değişiklikleri geri almak için 'ters aralık' kullanılabilir. Örneğin, kaynak ve hedef aynı dalı ifade ettiğinde, daha önce yapılmış bir revizyon 'geri alınabilir'. Bir de ters dizi ya da 'c' seçeneği negatif bir sayı ile birlikte kullanılır: 'M N-r': N, M'den daha büyük olmasıdır '-c -M' denktir, M -r: '. Bu gibi değişikliklerin geri alınması, 'ters birleştirme' olarak da bilinir.


  • Kaynak bir dosyaysa, o dosyaya farklılıklar uygulanır (önceki değişikliklerin ters birleştirilmesi için yararlıdır). Aksi takdirde, kaynak bir dizinse, hedef varsayılan olarak '.' Olur.

    Normal kullanımda, çalışma kopyası yerel bir değişiklik yapılmadan ve değiştirilmiş alt ağaçlar olmadan tek bir revizyonda güncel olmalıdır.

Misal:

svn merge -r 2983:289 path/to/file

Bu, yerel kopyanın [2983] (yukarıdaki alıntıya göre, sunucuyla senkronize olması gerekir - sizin sorumluluğunuzdadır) sunucudaki revizyon 289 ile değiştirilecektir. Değişiklik yerel olarak gerçekleşir, yani temiz bir kasanız varsa, değişiklikler yapılmadan önce değişiklikler incelenebilir.


-1

Aşağıdakiler benim için çalıştı.

Çok fazla yerel değişiklik yaptım ve yerel kopyadakileri atmak ve SVN'deki son kararlı sürümü kontrol etmek gerekiyordu.

  1. Yok sayılan dosyalar da dahil olmak üzere tüm dosyaların durumunu kontrol edin.

  2. Yeni eklenen ve yok sayılan dosyaları almak için tüm satırları selamlayın.

  3. Bunları değiştirin //.

  4. ve rm -rf tüm satırları.

    svn durumu - yoksay | grep '^ [? I]' | sed "s / ^ [? I] //" | xargs -I {} rm -rf "{}"

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.