SVN'deki tek bir dosyayı belirli bir düzeltmeye döndürme


182

Bir SVN deposunda aşağıda gösterildiği gibi bir dosya var, önceki bir sürüme geri dönmek istiyorum. SVN'de bunu yapmanın yolu nedir? Sadece bu dosyayı eski bir sürüme düşürmek istiyorum, tüm repoyu değil.

Teşekkürler.

$ svn log myfile.py
----------------------
r179 | xx | 2010-05-10

Change 3
----------------------
r175 | xx | 2010-05-08

Change 2
----------------------
r174 | xx | 2010-05-04

Initial

geri döndüğün zaman, ne demek istedin, 7 yıl önce, lol
Kalpesh Soni

Yanıtlar:


181

Eski dosyayı yalnızca çalışma kopyanızda istiyorsanız:

svn up -r 147 myfile.py

Geri almak isterseniz, bu " Alt sürümde kodumuzun eski bir sürümüne nasıl dönülür? "


8
ancak bir dahaki sefer güncellediğinizde geri istemediğiniz dosyayı alır ...: S
andygoestohollywood

2
geri istemiyorsanız, svn o dosyayı taahhüt, repo içine istediğiniz sürümü koymak için
Packet Tracer

14
Bu muhtemelen askerin istediği şeyi yapmaz. Bunu kullanarak, çalışma kopyası temizdir ve OLDUĞU GİBİ işlenemez ve belirtilen sürüm numarası olmayan bir "svn güncellemesi" en son, istenmeyen sürümü alır.
CXJ

1
Geri döndürülen dosyayı nasıl teslim edebilirim?
marcio

2
Bu doğru değil çünkü CXJ'den bahsedildiği gibi güncellenmiş dosyayı işlemenin bir yolu yok. Muhtemelen Mitch Dempsey'in dediği gibi yapmak istersiniz (ancak, dosyanın üzerine yazmaya zorlamak için --force): svn export --force -r 147 myfile.py myfile.py
avejidah

76

svn kedi de bir revizyon arg alır!

svn cat -r 175 mydir/myfile > mydir/myfile


20
Bu, sayfadaki en iyi cevaptır. Değiştirilen dosyayı işlenebilecek bir durumda bırakır.
dotancohen

yeni bir dosyaya yapıştırdığınızda bu işe yaramıyor gibi görünüyor
ahnbizcad

haha geriye baktığımda, yayınladığımda ne bağlamda düşündüğümü idk. Hatırlayamıyorum. Saçma görünüyor.
ahnbizcad

Bu, değişikliklerinizi geri almak ve herhangi bir sürüm kontrolü teknik bilgisi olmadan bir dosyayı önceden taahhütlü durumuna geri almak istediğinizde basit ve kolaydır.
İsimsiz

57
svn revert filename 

bu tek bir dosyayı geri almalıdır.


4
Daha uzun komutlarla diğer tüm cevapların ne olduğunu biliyor musunuz? Teşekkürler.
masterxilo

Rica ederim. Diğer cevapların ne olduğu hakkında hiçbir fikrim yok .. lol
thestar

13
Bu hangi düzeltmeye geri dönüyor? Doc diyor ki sadece en son repo ile değiştirildi. Soru, önceki bir sürüme nasıl dönüleceğidir.
tgkprog

1
Bu, repo'nun en son sürümüne geri döner. Soruların açıklamasını okursanız, dizinin tamamını değil, tek bir dosyayı nasıl geri döndüreceğini arıyor gibi görünüyor.
TheStar

5
Tüm bunların tek başına geri dönerek çalışma kopyanızı yok etmek olduğuna inanıyorum. Veya kontrol edildi. svn update -r VER dosyasını yaparak onaylayın, sonra bir svn revert yapın.
Gerard ONeill

50

Tek bir dosya için şunları yapabilirsiniz:

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

Yapabilirdiniz, svn revert <file>ancak bu yalnızca son çalışan kopyayı geri yükleyecektir.


2
dışa aktarın, ardından yerel kopyanıza yapıştırın, sonra tekrar taahhüt edin?
tgkprog

1
@tgkprog bunu yapmanın bir yolu, evet
Mitch Dempsey

@tgkprog ve "tercih edilen" yol nedir?
hbogert

Hiçbir fikrim yok ama bu benim için işe yaradı: geçmiş revizyonu ihraç etti. Not defterinde açıldı, kopyalandı, çalışma dosyasına yapıştırıldı. Bunu hangi devir ve neden hakkında yorum yaparak kafasına adadı. UI araçlarının daha iyi bir yolu olabilir.
tgkprog

21

Şimdiye kadar buradaki tüm cevapların önemli dezavantajları var gibi görünüyor, karmaşık (repo URI'sini bulmaları gerekiyor) veya sorunun muhtemelen sorduğu şeyi yapmıyorlar: Repo'yu daha eski bir sürümüyle tekrar çalışır duruma getirmek dosyası .

svn merge -r head:[revision-number-to-revert-to] [file-path]IMO bunu yapmanın en temiz ve basit yoludur. Silinen bir dosyayı geri getirmenin bu şekilde çalışmadığını lütfen unutmayın [1]. Ayrıca aşağıdaki soruya bakın: Bir dosyanın önceki SVN revizyonuna geri dönmenin daha iyi bir yolu var mı?

[1] İstediğiniz için svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn up, bkz . SVN'den silinen bir dosyayı geri yüklemenin doğru yolu nedir?


En azından Subversion sürümüm için, svn mergeherhangi bir nedenle birden fazla dosyayı argüman olarak almadığını belirtmek isterim . Bu durumda, hiçbir şey yapmıyor gibi görünüyor (hata mesajı olmadan).
Wrzlprmft

Ama komutum hala her dosya için tekrarlayarak çalışıyor, değil mi?
Michel Müller

Evet, gerçekten de öyle.
Wrzlprmft

1
Bunun en temiz olduğunu kabul etti.
KevinG

13

En iyi yol:

svn merge -c -RevisionToUndo ^/trunk

Bu, geri almak istemediğiniz dosyaları geri almaktan ziyade, revizyonun tüm dosyalarını geri alacaktır. -Düzeltme için önek olarak tire ( ) işlevini unutmayın .

svn revert File1 File2

Şimdi değişiklikleri geri al.


9

Yapmak istiyorsun

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

Bunu yaptıktan sonra, dosyanın revize edilebilir bir halini alacaksınız. Dosyayı uygulayın.


7

Bunu, svn catbir revizyon belirtmek zorunda kalmamanız için komutla yapmanın basit olduğunu gördüm .

svn cat mydir/myfile > mydir/myfile

Bu muhtemelen zaman damgası gibi inode (meta veri) verilerini desteklemez.


daha sonra dosyayı
kopyalayın

3
Bu benim için güncellemeden daha iyi çalıştı. Çünkü güncelleme bu dosyada yapılan değişikliği yapmanıza izin vermez. (svn 1.8.3)
fe_lix_

7

Kimse bundan bahsetmedi şaşırttı

revizyon numarasını bulmadan bunu yazabilirsiniz, sadece geri almak istediğiniz bir şey yaptıysanız, başka bir dosyayı değiştirdiyseniz ve hedef dosya son değiştirilen dosya değilse bu çalışmaz

svn merge -r HEAD:PREV file

Yorumlarınız varsa, düzenlemeler yapmadan önce lütfen burada görüşün.
Kalpesh Soni

1
Sorudaki senaryo, HEAD'den PREV'e gitmek için gereken değişiklikleri uygulayabilmemiz için en son değişikliğin ters birleştirilmesini gerektirmiyor mu?
Nick Russo

4
Komut svn merge -r HEAD:PREV file@Nick Russo'nun söylediği gibi olmalı
Heinz

4

Yalnızca birkaç dosyaysa ve Tortoise SVN kullanıyorsanız, aşağıdaki yaklaşımı kullanabilirsiniz:

  1. Kaynak dosyanızı sağ tıklayın ve "TortoiseSVN" -> "Günlüğü göster" i seçin.
  2. Günlükte bir düzeltmeyi sağ tıklayın ve "Düzeltmeyi şuraya kaydet ..." seçeneğini seçin.
  3. Eski revizyonun mevcut dosyanızın üzerine yazmasına izin verin.
  4. Üzerine yazılan kaynak dosyasını kaydedin.

Bu, xxxx'in eski revizyon numarası olduğu dosya-xxxx gibi yeni bir sürümden kaydedilmemiş dosyayı kaydeder. Sonra ne yapacağız? yeni düzeltmeyi sil (HEAD örn.), yeni dosyayı yeniden adlandır, ekle, tamamla?
Heinz

Hayır, dosya adındaki düzeltme numarasıyla kaydetmeyin. Aynı dosyanın geçerli sürümüyle tam olarak aynı dosya adıyla kaydedin (başka bir deyişle, dosya adında xxxx yok). O zaman bundan sonra sıradan bir taahhütte bulunun.
Elling

4

Henüz yorum yapmak için yeterli temsilcim olmadığından @Mitch Dempsy yanıtına ekliyorum.

svn export -r <REV> svn://host/path/to/file/on/repos --force

--Force eklenmesi, dışa aktarma işlemiyle yerel kopyanın üzerine yazılır ve ardından depoya göndermek için bir svn taahhüdü yapabilirsiniz.


ve bu en iyi cevap :)
Zgr3doo

neden bu en iyi cevap? tarih "svn yolu" yönetmez
Jason S

2

Tek bir dosya için alternatif bir seçenek, dosyanın geçerli sürümünü eski düzeltmeyle "değiştirmektir":

svn rm file.ext
svn cp svn://host/path/to/file/on/repo/file.ext@<REV> file.ext
svn ci

Bu, istenmeyen değişikliklerin bu dosya günlüğünde (ör. Svn günlük dosyası.ext) gösterilmemesi özelliğine sahiptir.


1

Belirli bir düzeltmeden tek bir dosyayı geri almak ve taahhüt edebilmek istiyorsanız, şunları yapın:

svn birleştirme -c - [OldRev #] [Dosyaadı]

yani. svn merge -c -150 myfile.py

Revizyon numarasındaki negatifi not edin


-1
sudo svn revert filename

bu tek bir dosyayı geri almanın daha iyi bir yoludur


2
Umarım sudoer izinlerine sahip bir üretim makinesine asla yaklaşamazsınız.
David Lakatos
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.