Sürüm bilgisi olmayan tüm dosyaları SVN'ye nasıl ekleyebilirim?


177

SVV deposuma çalışan bir kopyadaki tüm sürüm dosyalarını otomatik olarak 'svn eklemek' için iyi bir yol arıyorum.

Kaynak kontrolü altında olması gereken birkaç dosya oluşturabilen bir canlı sunucum var. Ben bunları birer birer eklemek yerine, bunları otomatik olarak eklemek için çalıştırabileceğiniz kısa bir komut dosyası istiyorum.

Sunucum Windows Server 2003 çalıştırdığından bir Unix çözümü çalışmaz.


1
@Saul Bu soru, bağladığınız soruyu açıkça önler, böylece nasıl yinelenebileceğini göremiyorum. Bir şey varsa diğer soru yineleniyor.
Neutrino

Cygwin bir seçenektir. Herhangi bir Windows ortamında bash gücünü verir. 10 yılı aşkın bir süredir çok küçük sorunları olan bir kullanıcı.
user151841

Yanıtlar:


346

svn add --force * --auto-props --parents --depth infinity -q

Harika bir ipucu! Bir açıklama: Eclipse'im yoksayma listesine otomatik olarak yeni dosyalar ekler. Bu bir yapılandırma meselesi olabilir, ama her neyse: --no-ignoreyardımcı olan bir seçenek var.

Bundan sonra şunları yapabilirsiniz:

svn commit -m 'Adding a file'

14
Harika bir ipucu. Svn durumunu kullanmaktan çok daha iyi. "svn add --force" yeterli görünüyor.
İsim

1
Bunu kısaltılmış bir makroya ayarlamanın kolay bir yolu var mı (örneğin, git ile yapabileceğiniz gibi)? Ayrıca, bu cevabı her biti açıklayacak şekilde güncellemek mümkün müdür?
MrDuk

2
@MrDuk: Kısaltılmış: alias magic="svn add --force * --auto-props --parents --depth infinity -q"- Açıklandı:svn help add
Ronan

17
Sorun, yok sayılan dosyaları doğru şekilde ekliyor mu? İstenmiyor.
Mart'ta ladieu

1
@Ad - *sonuna koymanız gerekir , aksi takdirde işe yaramaz (benim için kiraya)
vsync

72

Bu benim için farklı bir soru ama orada bu soruya ait bir cevap var:

svn status | grep '?' | sed 's/^.* /svn add /' | bash

8
Bu OP'nin sahip olmadığını söylediği UNIX araçlarını (grep, sed, bash) kullanır.
Naaff

3
Ayrıca gerçekten istersen muhtemelen pencere üzerinde sed ve grep kazmak olabilir.
Sam Saffron

1
Cygwin yorumundaki bu oylama için üzgünüm, kasıtlı değildi (ve geri alamıyorum). Aslında cygwin'in Windows'da alabileceğiniz kadar çirkin olduğunu düşünüyorum. En az Windows 2000'den beri ek bir şey yüklemeden çalışacak olan grep yerine findstr'yi kullanabilirsiniz.
Joey


2
Mbyrne215 ile birlikteyim; bu cevap bana OP'nin çözümünden daha fazla yardımcı oldu, bu yüzden oy veriyorum. OS X 10.6.7'de mükemmel çalışır.
Asbjørn Ulsberg

37

İşe yarayan şu:

c:\work\repo1>svn add . --force

Alt dizinlerin içeriğini ekler.

Yok sayılan dosyalar eklemez.

Hangi dosyaların eklendiğini listeler.

Komuttaki nokta geçerli dizini gösterir; geçerli dizinden farklı bir dizin eklemek istiyorsanız, bunun yerine belirli bir dizin adı veya yolu kullanılabilir.


Aslında bu olmalı .\*veya svn kökü farklı bir dizin üzerindeyse stuff\svn_root\*.
Nux

Takip etmiyorum. SVN komutları, yürütüldükleri yol bağlamında yürütülür, bu beklenmelidir. "svn add. \ *" tek başına gerçekte ne eklendiğini görmeyi imkansız hale getirerek bir sürü uyarı spam'ı yinelemez ve yazdırmaz. msgstr "svn add. \ * --force" recurse yapar ama aynı zamanda "svn: Atlama argümanı: E200025: '. \. svn' ayrılmış bir adla biter" yazar. Bu benim orijinal çözümümden daha kötü görünüyor.
Neutrino

SVN ;-) üzerinde muhtemelen tüm C sürücüsüne sahip olmadığınızı işaret ediyordum ve bu yüzden bir yol eklemelisiniz. Ve benim stuff\svn_rootalt dizinler (örneğin içinde stuff\svn_root\already_in_svn\not_in_svn.txt) dosyaları eklemiyor gibi yolu belirten benim test . Bu yüzden sonunda yıldız.
Nux

@Nux Ancak bunca yıldan sonra nihayet ne elde ettiğinizi görüyorum :) Komutta nokta, geçerli dizini belirten yoldur. Doğal olarak bunun yerine geçerli herhangi bir alternatif sunulabilir.
Neutrino

Bu doğru cevap. Yoksayılan dosyalar eklemeyi içeren bir çözümün en üst noktaya nasıl geldiğinden emin değilim. @Neutrino, yorumunuzu artık bu sayfada görünmeyen joey'ye kaldırmanızı öneririz ve ayrıca önerinizin yok sayılan dosyalar eklemediğini güçlendiren bir satır ekleyin
b_levitt

35

Bu benim için çalıştı:

svn add `svn status . | grep "^?" | awk '{print $2}'`

( Kaynak )

Windows için sorununuzu zaten çözdüğünüzde, bu bir UNIX çözümüdür (Sam'i takip eder). Buraya aynı soru soran bu soruya ulaşanlar için hala yararlı olduğunu düşündüğüm için ekledim (başlık "WINDOWS" anahtar kelimesini içermediğinden).

Not (Şub, 2015): "bdrx" tarafından yorumlandığı gibi, yukarıdaki komut bu şekilde daha da basitleştirilebilir:

 svn add `svn status . | awk '/^[?]/{print $2}'`

1
Güzel, kompakt, özlü, aynı zamanda uzamaya oldukça iyi ödünç veriyor. Teşekkürler.
Norman H

1
Harika. Ayrıca genişletmek, silmek vb değiştirmek için kolay
Drewid

İhtiyacım olan şey için mükemmel. Teşekkür ederim!
Jeff

2
Neden insanlar hep grep ve sonra awk için boru? Awk desen eşleştirmesi yapabilir awk '/^[?]/{print $2}':; Ekstra grep işlemine gerek yok.
bdrx

1
@bdrx: Belki de grep genellikle kalıp eşleşmesi ile ilişkili olduğu için? Benim kişisel durumumda, grep konusunda awk'den çok daha deneyimliyim. Bu tür şeyleri awk ile yapabileceğinizin farkında değildim, bu yüzden scriptlerimde awk'yi daha fazla kullanmaya başlayacağım. Teşekkürler!
lepe

5
svn add --force .

Bu, geçerli dizine ve tüm sürümlendirilmiş alt dizinlere sürüm bilgisi eklenmemiş bir dosya ekler.


5

Bu yöntem, içinde herhangi bir sayı / boşluk kombinasyonu bulunan dosya adlarını işlemelidir ...

svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"

İşte bu komutun ne yaptığına dair bir açıklama:

  • Tüm değiştirilmiş dosyaları listeleyin.
  • Bu listeyi '?' başlangıçta - yani yeni dosyalar.
  • Kaldır '?' başında satır karakteri.
  • Satırın başındaki boşlukları kaldırın.
  • Svn add komutunu birden çok kez çalıştırmak için dosya adlarını xargs içine ekleyin.

Boşluk içeren dosya adlarını 'svn add' içine aktarabilmek için -i argümanını kullanın - temel olarak, -i kümeleri yer tutucu olarak kullanılacak {} kümelerini "svn tarafından kullanılan dosya adının etrafına" Ekle'.

Bu yöntemin bir avantajı, bunun içinde boşluk bulunan dosya adlarını işlemesi gerektiğidir.


Bu Linux ya da benzerini varsayar (örneğin MinGW ya da Cygwin ). OP şunları söyledi: "Sunucum Windows Server 2003 çalıştırıyor, bu nedenle bir Unix çözümü çalışmayacak."
Peter Mortensen

4

Komut satırı olmayan bir çözüm kullanmak istiyorsanız, TortoiseSVN'de bu özellik yerleşik olarak bulunur. Üst düzey klasöre sağ tıklayın ve Ekle ... 'yi seçin .


Büyük depo ile TortoiseSVN kilitleniyor. Bu beni komut satırı alternatifleri aramaya
yöneltti


3

kullanın:

svn st | grep ? | cut -d? -f2 | xargs svn add

1
Veya svn status | cut -d ? -f 2 -s | xargs svn add
grep'in

Bu Linux ya da benzerini varsayar (örneğin MinGW ya da Cygwin ). OP şunları söyledi: "Sunucum Windows Server 2003 çalıştırıyor, bu nedenle bir Unix çözümü çalışmayacak."
Peter Mortensen

3

Her zaman kullanıyorum:

Kopyala yapıştır

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1

1
Op açıklığı, bir Unix çözümünün ona faydası olmadığını belirtir.
Neutrino

Bu Linux ya da benzerini varsayar (örneğin MinGW ya da Cygwin ). OP şunları söyledi: "Sunucum Windows Server 2003 çalıştırıyor, bu nedenle bir Unix çözümü çalışmayacak."
Peter Mortensen

3

Bu yazı Windows olarak etiketlendiğinden, Windows için bir çözüm üreteceğimi düşündüm. Süreci otomatikleştirmek istedim ve bir bat dosyası hazırladım. C # bir console.exe yapmaya direndi.

Tamamlama işlemine başladığımda veri havuzuma eklenmeyen dosya veya klasörleri eklemek istedim.

Cevapların çoğuyla ilgili sorun, TortoiseSVN'deki yoksayma listeme göre göz ardı edilmesi gereken sürümsüz dosyaları listeleyecekler .

İşte benim kanca ayarı ve bunu yapan toplu iş dosyası

Kaplumbağa Kanca Senaryosu:

"start_commit_hook".
(where I checkout) working copy path = C:\Projects
command line: C:\windows\system32\cmd.exe /c C:\Tools\SVN\svnadd.bat
(X) Wait for the script to finish
(X) (Optional) Hide script while running
(X) Always execute the script

svnadd.bat

@echo off

rem Iterates each line result from the command which lists files/folders
rem     not added to source control while respecting the ignore list.
FOR /F "delims==" %%G IN ('svn status ^| findstr "^?"') DO call :DoSVNAdd "%%G"
goto end

:DoSVNAdd
set addPath=%1
rem Remove line prefix formatting from svn status command output as well as
rem    quotes from the G call (as required for long folder names). Then
rem    place quotes back around the path for the SVN add call.
set addPath="%addPath:~9,-1%"
svn add %addPath%

:end

2
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%i %%j"

Bu uygulamada, klasörlerinizin / dosya adlarınızın aşağıdaki gibi birden fazla alanı olması durumunda sorun yaşayacaksınız:

"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Sega Mega      2"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\One space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Double  space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Single"

bu gibi durumlar basit:

for /f "usebackq tokens=1*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%j"

2

Linux kullanıyorsanız veya Windows'ta Cygwin veya MinGW kullanıyorsanız, aşağıdaki gibi bash benzeri çözümleri kullanabilirsiniz. Burada sunulan diğer benzerlerin aksine, bu dosya adı alanlarını dikkate alır:

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done

Bu ne için? CMD? Bash? Bash (veya benzer bir kabuk) gibi görünüyor. Bu durumda, Linux ya da benzerini varsayar (örneğin MinGW ya da Cygwin ). OP şunları söyledi: "Sunucum Windows Server 2003 çalıştırıyor, bu nedenle bir Unix çözümü çalışmayacak."
Peter Mortensen

Teşekkürler, haklısın, Windows'tayken Cygwin'i Bash ile kullanıyorum. Ancak "Sunucum Windows Server 2003 çalıştırıyor, bu nedenle bir Unix çözümü çalışmayacak." yanlış. Belki Cygwin veya MinGW kullanmak istemiyor, ama kendini bu şekilde ifade etmedi. Cevabı yeniden düzenledim.
ajaest

1

Sadece birkaç dosya özyinelemeli olarak nasıl ekleyeceğinizi anlamaya çalışırken biraz zaman geçirdikten sonra, benim için ne işe yaradığını paylaşmak için geçerli olacağını düşündüm:

FOR /F %F IN ('dir /s /b /a:d') DO svn add --depth=empty "%F"
FOR /F %F IN ('dir /s /b /a *.cs *.csproj *.rpt *.xsd *.resx *.ico *.sql') DO svn add "%F"

İşte bazı açıklamalar.

İlk komut tüm dizinleri ekler. İkinci komut yalnızca belirtilen kalıplara göre dosyaları ekler.

Daha fazla ayrıntı vereyim:

  • FOR: döngü kontrolü.
  • / F: dosya ve dizinleri alır (tam olarak emin değilim).
  • % F: bu bir değişkendir; listelenen dosyaların her birinin değerini aynı anda varsayacaktır; başka bir tek karakterli adı olabilir.
  • IN: açıklamaya gerek yok, değil mi?
  • ('dir / s / b / a: d'): dizinleri listeleyecek DOS komutu; benim durumumda / s özyinelemeli, / b yalnızca tam yolu almaktır, / a: d yalnızca dizin anlamına gelir; parantez ve kesme işaretlerini saklamak istediğiniz şekilde değiştirin.
  • DO: komutta bir sonraki adımın her bir dizin için yürütülecek olan anlamına gelir
  • svn add --depth = empty: çalıştırılmak istenen SVN komando; derinlik tanımı, içindeki dosyaları değil sadece dizini eklemek anlamına gelir.
  • "% F": daha önce tanımlanan değişkeni bu şekilde kullanırsınız.

İkinci komutta, tek fark dir komutu ve svn komutudur, bence yeterince açıktır.


0

Komutu kullanabilirsiniz

svn add * force--

veya

svn add <directory/file name>

Dosyalarınız / dizinleriniz özyinelemeli olarak eklenmiyorsa. Sonra kontrol edin.

Yinelemeli ekleme varsayılan özelliktir . SVN kitabında görebilirsiniz .

Sorun yoksayma listenizde veya genel mülklerinizde olabilir.

Çözüm Google sorunu izci var

Yıldızı yoksaymak için genel özellikleri kontrol edin (*)

  • Pencerenizdeki repo'yu sağ tıklayın. Seçin TortoiseSVN > Properties.
  • Bir mülkünüz olup olmadığına bakın svn:global-ignores with a value of *
  • Eğer mülkünüz star(*)varsa, özyinelemeli eklemeyi yok sayar. Bu özelliği kaldırın.

Global yok sayma düzenini yıldız yok sayma açısından kontrol edin (*)

  • Pencerenizdeki repo'yu sağ tıklayın. Seçin TortoiseSVN > Settings > General.
  • Orada yıldız (*) ayarlamadıysanız Global Yoksayma Deseni'ne bakın .
  • Bulduysanız star(*), bu özelliği kaldırın.

Bu adam da bu mülkün neden projeme eklendiğini açıkladı .

Oraya en çok benzeyen, birisinin herhangi bir uzantı olmadan bir dosyayı sağ tıklayıp TortoiseSVN -> SVN Yoksay -> * (özyinelemeli) seçmiş ve bunu taahhüt etmiş olmasıdır.

Bu mülk değişikliğini kimin yaptığını görmek için günlüğü kontrol edebilir, gerçekte ne yapmaya çalıştıklarını öğrenebilir ve gelecekte daha dikkatli olmalarını isteyebilirsiniz. :)


0

Linux'ta aşağıdaki komutu girebilirsiniz:

find ./ -name "*." | xargs svn add

0

Awk & sed'nin standart olmadığı Windows'u belirttiği için:

for /f "tokens=1*" %e in ('svn status^|findstr "^\?"') do svn add "%f"

veya bir toplu iş dosyasında:

for /f "tokens=1*" %%e in ('svn status^|findstr "^\?"') do svn add "%%f"

0

Bu, bir dizini yeni dosyalar da dahil olmak üzere SVN ile senkronize etmenin tembel ve tehlikeli yoludur:

svn rm --keep-local dir
svn add dir

Her ne kadar bu bir tutam işe yarayabilse de, ciddi sonuçları da olabilir. Örneğin, SVN genellikle bir dosyanın geçmişini takip etmez.

Bir dizini senkronize etmenin ideal yolu, daha sonra svn yamasını kullanabilmek, ancak diff komutundaki formatlardan sapmaktır ve svn diff komutu, dosya sistemi düzeyindeki farklılıklar yerine çalışma dizini farklılıklarını karşılaştırır.


-1

Ben benzer bir şey yaptım düşünüyorum:

svn add . --recursive

ama hafızamın doğru olup olmadığından emin değilim ;-p


2
sadece hafızanız için bir güncelleme: svn 1.4 ve 1.5 desteklemiyor
yinelemeli
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.