SVN'den silinmiş bir dosyayı geri yüklemenin doğru yolu nedir?


119

Depodan bir dosya sildim ve şimdi onu geri koymak istiyorum. Anlayabildiğim en iyi şey:

  • silmeden önce revizyonu güncelle
  • dosyaları başka bir yere kopyala
  • başa güncelle
  • dosyaları geri kopyala
  • onları ekle
  • işlemek

Bu sadece kötü kokuyor ve önyükleme yapmak için tüm geçmişi kaybediyor. Bunu yapmanın daha iyi bir yolu olmalı. Zaten SVN Kitabına baktım ama hiçbir şey bulamadım ve şimdi SVN etiket listesine bakıyorum.


4
Şüphesiz tukushan'ın cevabı sorunuza doğrudan doğru cevaptır ve kabul edilmeli mi?
James McCormack

@JamesMcCormack: cevabında NB'ye bakın.
BCS

2
Bir ipucu, eğer dosyayı sildiyseniz ve henüz değişikliği yapmadıysanız, sadece sağ tıklama ve güncelleme dosyayı kurtaracaktır.
Hammad Khan

Yanıtlar:


57

Svn birleştirmeyi kullanın:

svn merge -c -[rev num that deleted the file] http://<path to repository>

Yani bir örnek:

svn merge -c -12345 https://svn.mysite.com/svn/repo/project/trunk
             ^ The negative is important

TortoiseSVN için (Sanırım ...)

  • Explorer'a sağ tıklayın, TortoiseSVN -> Birleştir'e gidin ...
  • "Bir revizyon aralığını birleştir" in seçili olduğundan emin olun, İleri'yi tıklayın
  • "Birleştirilecek revizyon aralığı" metin kutusunda, dosyayı kaldıran revizyonu belirtin
  • "Ters birleştirme" onay kutusunu işaretleyin, İleri'yi tıklayın
  • Birleştir'i tıklayın

Ancak bu tamamen test edilmemiştir.


OP tarafından düzenlendi : Bu, benim TortoiseSVN sürümümde çalışıyor (sonraki düğmesi olmayan eski tür)

  • Öğelerin silindiği klasöre gidin
  • Explorer'a sağ tıklayın, TortoiseSVN -> Birleştir'e gidin ...
  • içinde itibaren bölümünde silme yaptığı revizyon girmek
  • içinde için bölüm silme önce revizyon girin.
  • "Birleştir" i tıklayın
  • işlemek

İşin püf noktası geriye doğru birleşmektir . Sean.bright beni doğru yöne yönlendirdiği için tebrikler !


Düzenle: Farklı versiyonlar kullanıyoruz. Tarif ettiğim yöntem, TortoiseSVN versiyonumla mükemmel çalıştı.

Ayrıca, işlemede tersine birleştirdiğiniz birden fazla değişiklik varsa, kaydetmeden önce birleştirme tamamlandıktan sonra bu diğer değişiklikleri geri almak isteyeceksiniz. Yapmazsanız, bu ekstra değişiklikler de geri alınacaktır.


Windows kullanıyorum ve SVN'nin CLI sürümüne sahip değilim. ortoiseSVN'ye bunu nasıl yaptıracağınızı biliyor musunuz?
BCS

Kaplumbağa sağ tıklama menüsünde "birleştirme" seçeneğine sahiptir. Devir için doldurulması gereken kutuları vardır. Ayrıca doğru ayarlayıp ayarlamadığınızı görmek için "Kuru Çalıştırma". Ve unutmayın, sonuç siz taahhüt edene kadar sayılmaz. Her şey karışırsa geri dönebilirsiniz.
gbarry

OP'nin daha eski bir Tortoise versiyonuna sahip olduğunu söyleyebilirim. Yeni olanın farklı (daha düşük) bir birleştirme iletişim kutusu var
1800 BİLGİ

Henüz berbat olmayan HERHANGİ bir birleştirme sistemi görmedim. Metin, dosyalar, dizinler, Word belgeleri, iğrenç. Bunun çözülebilir bir problem olmadığını düşünüyorum. OTOH şeyler aşağı yukarı emebilir. :)
BCS

1
Birkaç dosyayı geri alır ve sonra geri alırsanız, geri dönüşlerden biri bu geri alınmaz. Ah! Bir şeyi incittiğimi düşünüyorum.
BCS

176

Sean Bright tarafından önerildiği gibi bir svn birleştirme yapmanın sorunu, silme işlemiyle aynı revizyonda yapılan diğer değişikliklerin yeniden tanıtılmasıdır. Bir svn kopyası, yalnızca silinen dosyaları etkileyecek daha hedefli bir işlemdir.

Tortoise SVN'yi kullanarak, çalışma kopya dizininizden ve sonraki SVN revizyonlarından silinmiş bir dosyayı, aşağıdaki şekilde bir svn kopyası aracılığıyla yeniden canlandırabilirsiniz:

  • Daha önce dosyayı içeren çalışma kopyalama klasörüne gidin.
  • Explorer'da klasöre sağ tıklayın, TortoiseSVN -> Günlüğü göster'e gidin.
  • Dosyayı silen revizyondan hemen önceki revizyon numarasına sağ tıklayın ve "Depoya gözat" seçeneğini seçin.
  • Silinen dosyaya sağ tıklayın ve "Çalışan kopyaya kopyala ..." seçeneğini seçin ve kaydedin.

Silinen dosya şimdi çalışan kopya klasöründe olacaktır. Yeniden SVN'ye eklemek için, geri yüklenen dosyaya sağ tıklayın ve SVN Commit'i seçin.

Not: Bu yöntem geri yüklenen dosyanın önceki geçmişini koruyacaktır, ancak TortoiseSVN günlüğündeki önceki geçmişi görmek için Günlük iletileri iletişim kutusunda "Kopyalamada / yeniden adlandırmada durdur" seçeneğinin işaretli olmadığından emin olmanız gerekir.


26
Bu, doğrudan sunucuda da gerçekleştirilebilir, silinen dosyalar veya klasörler oldukça büyükse yararlıdır: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path
Craig

Bunu yapmanın doğru yolu bu. TortoiseSVN 1.8.1 ile denedim ve tavsiye edildiği gibi çalışıyor.
Dr Gianluigi Zane Zanettini

Mükemmel!! Basit ve etkili. Çözüm için teşekkürler
Hunter

Bu yöntem, bir dosyayı ana dalından silinmiş bir alt dala geri yüklememi çok daha kolaylaştırdı. Belki bunu yapmanın bir yolu vardı merge, ama ben çözemedim.
arr_sea

3. adımda "hemen önce" önemlidir. 4. adımda, Tortoise, Windows silme kullanarak dosyayı silmiş olmama rağmen dosyanın zaten var olduğundan şikayet etmeye devam etti. Önce çalışma kopyamı güncellemem gerekiyordu. (Meslektaşım, Tortoise silmeyi kullanarak birkaç dosyayı silmiş ve sonra değişiklikleri gerçekleştirmişti.) TortoiseSVN 1.8.1.
leqid


16

Gerçekleştirilen değişiklikleri geri almak için Tortoise SVN kopyalama işlevini kullanın:

  1. Silinen dosyaları / klasörü içeren ana klasöre sağ tıklayın
  2. "Günlüğü göster" i seçin
  3. Değişikliklerin / silinmenin daha önce yapıldığı sürümü seçin ve sağ tıklayın
  4. "Havuza göz at" ı seçin
  5. Geri yüklenmesi gereken dosyayı / klasörü seçin ve sağ tıklayın
  6. Dosyaları / klasörleri baş revizyona kopyalayacak "kopyala" yı seçin

umarım yardımcı olur


13

Her zaman bir sunucu işlemi olarak svn copy kullanıyorum, bu yüzden iki çalışma yolu ile çalışıp çalışmadığından emin değilim.

Aşağıda, silinmiş bir dosyayı projenin yerel çalışan bir kopyasına geri yüklemenin bir örneği verilmiştir:

svn copy https://repos/project/modules/module.js@3502 modules/module.js

Proje dizinindeyken. Bu, tüm dizinleri geri yüklemek için de işe yarar.


2
+1 Kopya @ çalıştı. -R kopyası, Mac OSX altında CollabNet svn 1.6.17 için çalışmıyor gibi görünüyor.
Grey

2
Ayrıca kullanılan revizyon , silme işleminden hemen önceki revizyon olmalıdır .
Gri

6

Tortoise SVN kullanıyorsanız, değişiklikleri yalnızca bu revizyondan çalışma kopyanıza geri döndürebilmeli (etkili bir şekilde ters birleştirme gerçekleştirebilmeli), ardından dosyayı yeniden eklemek için başka bir işlem yapmalısınız. İzlenecek adımlar şunlardır:

  1. Dosyayı sildiğiniz çalışma kopyasında klasöre göz atın.
  2. Depo tarayıcısına gidin.
  3. Dosyayı sildiğiniz düzeltmeye gidin.
  4. Değişiklik listesinde, sildiğiniz dosyayı bulun.
  5. Dosyayı sağ tıklayın ve "Bu revizyondaki değişiklikleri geri al" seçeneğine gidin.
  6. Bu, geçmişinizi koruyarak dosyayı çalışma kopyanıza geri yükleyecektir.
  7. Dosyayı deponuza geri eklemek için işleyin.

Tamam bu durumda, soru az önce anlattığın şeyin nasıl yapılacağıydı. (Cevap: geriye doğru birleştirmeyi kullanın)
BCS

1
Tortoise SVN'de bunun nasıl yapılacağından bahsediyordum. Daha fazla ayrıntı ekleyeceğim.
davogones

5

Dosyaları geri yükleyebilmemin ve revizyon geçmişini kaybetmememin en kolay yolu SVN kopyasını kullanmaktır , bana yukarıdaki birleştirme örneği aynı şeyi elde etmenin daha karmaşık bir yolu gibi görünüyor. Bir revizyonu geri yüklemek istediğinizde neden birleştirme ihtiyacı var?

Bu durumda aşağıdakileri kullanıyorum ve oldukça iyi çalışıyor.

svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs

Her zaman svn copybir sunucu işlemi olarak kullanıyorum , bu yüzden iki çalışma yolu ile çalışıp çalışmadığından emin değilim.


3
SVN COPY, önerilen yaklaşımdır. Sözdizimi çok basittir: svn copy [SVN URL] @ [REVISION # NEREDE DOSYA VAR] [Visualsvn.com/support/svnbook/branchmerge/basicmerging'den [GERİ YÜKLENECEK YEREL YOL] . Bunu kendim kullandım.
amit

Bu benim için çok mantıklı geliyor, ben de bu yaklaşımı kullanıyorum
Dmitry Pashkevich

4

İle Kaplumbağa SVN :

Henüz değişikliklerinizi yapmadıysanız, dosyayı veya dizini sildiğiniz ana klasöre geri dönebilirsiniz.

Silinen dosyayı zaten kaydetmişseniz, arşiv tarayıcısını kullanabilir, dosyanın hala mevcut olduğu revizyona geçebilir ve ardından bağlam menüsünden Kopyala ... komutunu kullanabilirsiniz. Çalışan kopyanızın yolunu hedef olarak girin ve silinen dosya depodan çalışma kopyanıza kopyalanacaktır.


Güzel. Bunu bir dahaki sefere deneyeceğim.
BCS

1

Geri yüklemek istediğiniz tek dosyayı kontrol edebilmelisiniz. svn co svn://your_repos/path/to/file/you/want/to/restore@revNerede gibi bir şey denerevDosyanın bulunduğu son revizyonun olduğu .

Bunu tam olarak biraz önce yapmak zorundaydım ve doğru hatırlıyorsam, -rseçeneğini kullanmak svnişe yaramadı; :revSözdizimini kullanmak zorundaydım . (Geriye doğru hatırlamış olsam da ...)


İstediğim bu değil. Dosyayı depoya geri yamalamak ve SVN'nin bunun aynı dosya olduğunu bilmesini istiyorum.
BCS
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.