Çalışan kopyayı sıfırlamak için bir Subversion komutu var mı?


110

Çalışan bir kopyayı tam olarak havuzda depolanan duruma "sıfırlayacak" tek bir Subversion komutu var mı? git reset --hardVeya gibi bir şey (ha, hard Git resetlemesi de versiyonsuz dosyaları kaldırmaz!) rm -rf wc && svn co <url> wc.

Güncelleme: Çalışma kopyasındaki fazladan dosyaları silmediği için basit bir geri dönüşün peşinde değilim. Yalnızca verileri tekrar indirmek zorunda kalmadan, çalışan kopyayı silmek ve tekrar kontrol etmekle aynı olacak bir şeyi gerçekten istiyorum. (Açıkçası, taahhüt edilmeyen tüm değişiklikleri kaybetmeyi umursamıyorum.)


çalışma kopyasındaki tüm değişiklikleri geri mi alıyorsunuz?
mauris

5
git clean -xdfKaynak kontrolü altında olmayan şeyleri kaldırmak için kullanırsınız .
vcsjones

1
@vcsjones: Teşekkürler, git cleantam olarak aradığım alıntılar için man sayfası : "Bu, temiz bir yapıyı test etmek için bozulmamış bir çalışma dizini oluşturmak için (muhtemelen git reset ile bağlantılı olarak) kullanılabilir." Subversion'ın böyle yerleşik bir şeye sahip olmaması üzücü.
zoul

Yanıtlar:


180

Aşağıdaki gibi özyinelemeli olarak geri dönebilirsiniz:

svn revert --recursive .

Kaynak kontrolü altında olmayan şeyleri kaldırmanın (yaratıcı bir komut dosyası yazmadan) yolu yoktur. Bence yapabileceğiniz en yakın şey, tüm dosyaları yinelemek, sonucunu kullanın ve sonra grep'i kullanın svn listve grep başarısız olursa, silin.

DÜZENLEME : Yaratıcı komut dosyası için çözüm burada: Subversion unversion dosyalarını otomatik olarak kaldırın

Böylece revert, bağlantılı sorudaki cevap ile size en uygun cevabı birleştiren bir komut dosyası oluşturabilirsiniz .


3
svn cleanupİlk önce tuvalette de koşmak isteyebilirsiniz . Bu, iptal edilen birleşmelerden sonra temizlik için standart pratiğimdir.
Mike Miller

kaplumbağa ayrıca temizleme diyalog penceresinde "versiyonlanmamış dosyaları kaldır" seçeneğine de sahiptir.
v.oddou

2
"Sürülmemiş dosyaları kaldır" komut satırı aracılığıyla kullanılabilir olsaydı iyi olurdu. Özellikle otomatik derlemeler için.
C.Tewalt

3
Cevabımı görün ... --svn temizliği için kaldırılmamış var
Denny Weinberg

38

İzlenen dosyaları geri döndürmek için

svn revert . -R

İzlenmeyen dosyaları temizlemek için

svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

-rf/ İlk başta korkmuştum, ama bir kez bu nedenlerle olmayacak anlaşılan gerektiğini içerebilir:

  1. Yalnızca tamamen izlenmeyen dizinler, iletilen modelle eşleşir rm
  2. -rfBaşka bu dizinleri kaldırılmayacak gereklidir

Geri dönmek ve temizlemek için (OP sorusu)

svn revert . -R && svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

Tutarlı kullanım kolaylığı için

.Bash_aliasesinize kalıcı takma ad ekleyin

alias svn.HardReset='read -p "destroy all local changes?[y/N]" && [[ $REPLY =~ ^[yY] ]] && svn revert . -R && rm -rf $(awk -f <(echo "/^?/{print \$2}") <(svn status) ;)'

2. pasaj benim için çalışmıyor gibi görünüyor:awk: fatal: error reading input file '-': Input/output error
hbogert

Ben kaçmak zorunda ?içinde awkaksi takdirde çıkışında tüm satırları eşleşti komutasvn status
gpanders

23

Şunları kullanarak yerel kopyanızın içindeki her şeyi silin:

rm -r your_local_svn_dir_path/*

Ve aşağıdaki komutu kullanarak her şeyi özyinelemeli olarak geri alın.

svn revert -R your_local_svn_dir_path

Bu, tüm dizini silmekten ve ardından yeni bir kontrol işleminden çok daha hızlıdır, çünkü dosyalar yerel SVN meta verilerinizden geri yüklenmektedir. Ağ bağlantısına bile ihtiyaç duymaz.


4
çok daha hızlı, svn temizlemedir - kaldırılmamış.
Znik

7
svn revert . -R

her şeyi sıfırlamak için.

svn revert path/to/file

tek bir dosya için


1
Bu, çalışma kopyasındaki fazladan dönüştürülmemiş dosyaları silmez, değil mi?
zoul

Ben öyle düşünmüyorum @zoul ama ben SVN kullanılan beri süre oldu çünkü beni bu konuda teklif yok
Abe Voelker

maalesef izlenmeyen dosyalara dokunmuyor. svn geri döndürmeyi deneyin -R your_local_svn_dir_path
Znik

7

Versiyonsuz dosyaları silin ve değişiklikleri geri alın:

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

Dışarı:

D         D:\tmp\sql\update\abc.txt

1
ek komut dosyası olmadan en iyi cevap budur. bu evrenseldir ve birçok svn sürümüyle uyumludur.
Znik

3

Saf Windows cmd / bat çözümü:

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
IF EXIST "%1\*" (
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof

2

Çalışan kopyayı işletim sisteminden silin ve tekrar kontrol edin en basitidir, ancak açıkçası tek bir komut değildir.


Acı verici derecede yavaş. Bu yüzden bunun etrafında bir yol arıyordum.
zoul

1
+1, En azından bulduğum tuhaf sorunları çözmenin tek yolu budur.
Brad

2

Çok hızlı ve basit ve tam olarak istediğinizi yapıyor

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

/(Config|.ini)/ kendi amaçlarım içindir.

Ve svn komutuna --no-ignore eklemek iyi bir fikir olabilir


2
Bu çok korkunç. Windows kullanıcıları ne olacak? Subversion'ın bir sürüm kontrol aracı olarak ciddiye alınmadan önce biraz çalışmaya ihtiyacı var.
Warren P

1

İzlenmeyen dosyaları kaldırmak için

Bash'de tarafından bildirilen izlenmemiş tüm dosyaları şu şekilde listeleyebildim svn st:

echo $(svn st | grep -P "^\?" | cut -c 9-)

Kendinizi şanslı hissediyorsanız, izlenmeyen dosyaları silmek için echoile değiştirebilirsiniz rm. Veya kendinizi daha az şanslı hissediyorsanız, silmek istediğiniz dosyaları elle kopyalayın.


(Kalan dosyaları geri döndürmek için @ abe-voelker'ın cevabını kullandım: https://stackoverflow.com/a/6204601/1695680 )

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.