Bagaimana saya bisa menambahkan 'semua file tidak berversi ke SVN?


177

Saya mencari cara yang baik untuk secara otomatis 'menambahkan' semua file tidak berversi dalam copy pekerjaan ke repositori SVN saya.

Saya memiliki server langsung yang dapat membuat beberapa file yang harus di bawah kendali sumber. Saya ingin memiliki skrip pendek yang dapat saya jalankan untuk secara otomatis menambahkan ini, bukannya melalui dan menambahkannya satu per satu.

Server saya menjalankan Windows Server 2003 sehingga solusi Unix tidak akan berfungsi.


1
@ Saul Pertanyaan ini jelas lebih dulu dari yang Anda tautkan jadi saya tidak melihat bagaimana ini bisa menjadi duplikat. Jika ada pertanyaan lain adalah duplikat.
Neutrino

Cygwin adalah sebuah opsi. Memberi Anda kekuatan bash di lingkungan jendela apa pun. Telah menjadi pengguna selama lebih dari 10 tahun dengan masalah yang sangat kecil.
user151841

Jawaban:


346

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

Tip yang bagus! Satu komentar: Eclipse saya menambahkan file baru ke daftar abaikan secara otomatis. Ini mungkin masalah konfigurasi, tetapi bagaimanapun juga: ada --no-ignoreopsi yang membantu.

Setelah ini, Anda dapat melakukan:

svn commit -m 'Adding a file'

14
Tip yang bagus. Jauh lebih baik daripada menggunakan status svn. "svn add --force" tampaknya cukup.
Nama

1
Apakah ada cara mudah untuk mengatur ini ke makro singkat (yaitu, seperti yang Anda bisa dengan git)? Juga, apakah mungkin untuk memperbarui jawaban ini sehingga menjelaskan setiap bit?
MrDuk

2
@ MrDuk: Dipendekkan: alias magic="svn add --force * --auto-props --parents --depth infinity -q"- Dijelaskan:svn help add
Ronan

17
Masalahnya, apakah ini menambahkan file yang diabaikan dengan benar? Tidak diinginkan.
ladieu

1
@Nama - Anda harus meletakkan *di akhir, kalau tidak itu tidak akan berhasil (sewa untuk saya)
vsync

72

Ini adalah pertanyaan yang berbeda dengan saya tetapi ada jawaban di sana yang termasuk dalam pertanyaan ini:

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

8
Ini menggunakan alat UNIX (grep, sed, bash) yang menurut OP tidak dia miliki.
Naaff

3
Anda juga mungkin bisa menggali sed dan grep di windows jika Anda benar-benar menginginkannya.
Sam Saffron

1
Maaf untuk suara positif pada komentar cygwin, tidak disengaja (dan saya tidak bisa membatalkannya). Sebenarnya saya pikir cygwin sama jeleknya dengan yang Anda dapatkan di Windows. Anda masih dapat menggunakan findstr daripada grep yang akan berfungsi setidaknya sejak Windows 2000 tanpa menginstal apa pun tambahan.
Joey


2
Saya dengan mbyrne215; jawaban ini membantu saya lebih dari solusi OP, jadi saya memilihnya. Berfungsi sempurna di OS X 10.6.7.
Asbjørn Ulsberg

37

Apa yang berhasil adalah ini:

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

Menambahkan isi subdirektori.

Tidak menambahkan file yang diabaikan.

Daftar file apa yang ditambahkan.

Titik dalam perintah menunjukkan direktori saat ini, ini dapat diganti dengan nama direktori atau jalur tertentu jika Anda ingin menambahkan direktori yang berbeda dari yang saat ini.


Sebenarnya itu seharusnya .\*atau jika svn root berada pada dir yang berbeda stuff\svn_root\*.
Nux

Saya tidak mengikuti. Perintah untuk dieksekusi SVN dalam konteks jalan dari mana mereka dieksekusi, ini yang diharapkan. "svn add. \ *" sendiri tidak berulang dan mencetak banyak spam peringatan sehingga tidak mungkin untuk melihat apa yang sebenarnya ditambahkan. "svn add. \ * --force" tidak berulang tetapi juga mencetak "svn: Melewati argumen: E200025: '. \. svn' berakhir dengan nama yang dipesan". Jadi itu sepertinya lebih buruk daripada solusi asli saya.
Neutrino

Saya menunjukkan bahwa Anda mungkin tidak memiliki seluruh drive C di SVN ;-), dan karenanya Anda harus menambahkan path. Dan dari jalur pengujian pengujian saya seperti stuff\svn_roottidak menambahkan file di sub direktori (misalnya di stuff\svn_root\already_in_svn\not_in_svn.txt). Oleh karena itu bintang di akhir.
Nux

@Nux Hanya sekarang setelah bertahun-tahun ini saya akhirnya melihat apa yang Anda peroleh :) Pada perintah, titik adalah jalur yang menentukan direktori saat ini. Secara alami, setiap alternatif yang valid dapat diberikan.
Neutrino

Ini adalah jawaban yang benar. Saya tidak yakin bagaimana solusi yang mencakup penambahan file yang diabaikan memiliki posisi teratas. @Neutrino, sarankan hapus komentar Anda untuk bergabung yang tidak lagi muncul di halaman ini, dan juga tambahkan baris yang menguatkan bahwa saran Anda TIDAK menambahkan file yang diabaikan
b_levitt

35

Ini bekerja untuk saya:

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

( Sumber )

Karena Anda sudah memecahkan masalah Anda untuk Windows, ini adalah solusi UNIX (mengikuti Sam). Saya menambahkan di sini karena saya pikir itu masih berguna bagi mereka yang mencapai pertanyaan ini menanyakan hal yang sama (karena judulnya tidak termasuk kata kunci "WINDOWS").

Catatan (Feb, 2015): Seperti yang dikomentari oleh "bdrx", perintah di atas dapat lebih disederhanakan dengan cara ini:

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

1
Bagus, ringkas, ringkas, juga cocok untuk ekstensi dengan cukup baik. Terima kasih.
Norman H

1
Bagus. Juga mudah diperluas, dimodifikasi untuk dihapus, dll.
Drewid

Sempurna untuk apa yang saya butuhkan. Terima kasih!
Jeff

2
Mengapa orang selalu grep dan kemudian pipa untuk awk? Awk dapat melakukan pencocokan pola: awk '/^[?]/{print $2}'; Tidak perlu untuk proses grep tambahan.
bdrx

1
@bdrx: Mungkin karena grep umumnya dikaitkan dengan pencocokan pola? Dalam kasus pribadi saya, saya jauh lebih berpengalaman dengan grep daripada dengan awk. Saya tidak sadar bahwa Anda dapat melakukan hal-hal seperti itu dalam awk, jadi saya akan mulai menggunakan awk lebih banyak dalam skrip saya. Terima kasih!
lepe

5
svn add --force .

Ini akan menambahkan file tidak berversi apa pun di direktori saat ini dan semua direktori anak berversi.


5

Metode ini harus menangani nama file yang memiliki nomor / kombinasi spasi di dalamnya ...

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

Berikut adalah penjelasan tentang apa yang dilakukan perintah itu:

  • Daftar semua file yang diubah.
  • Batasi daftar ini hingga baris dengan '?' di awal - yaitu file baru.
  • Hapus '?' karakter di awal baris.
  • Hapus spasi di awal baris.
  • Pipa nama file ke xargs untuk menjalankan svn tambahkan beberapa kali.

Gunakan argumen -i ke xargs untuk menangani kemampuan mengimpor file dengan spasi ke 'svn add' - pada dasarnya, -i menetapkan {} untuk digunakan sebagai pengganti sehingga kita dapat menempatkan "karakter di sekitar nama file yang digunakan oleh 'svn Menambahkan'.

Keuntungan dari metode ini adalah bahwa ini harus menangani nama file dengan spasi di dalamnya.


Ini menganggap Linux atau yang serupa (misalnya MinGW atau Cygwin ). OP menyatakan: "Server saya menjalankan Windows Server 2003 sehingga solusi Unix tidak akan berfungsi."
Peter Mortensen

4

TortoiseSVN memiliki kemampuan ini bawaan, jika Anda bersedia menggunakan solusi non-command-line. Cukup klik kanan pada folder tingkat atas dan pilih Tambah ...


Dengan repositori besar, TortoiseSVN hang. Ini membuat saya mencari alternatif baris perintah :-)
Upendra


3

Menggunakan:

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

1
Atau Anda dapat menggunakan cut untuk melakukan pekerjaan grep: svn status | cut -d ? -f 2 -s | xargs svn add
Eric3

Ini menganggap Linux atau yang serupa (misalnya MinGW atau Cygwin ). OP menyatakan: "Server saya menjalankan Windows Server 2003 sehingga solusi Unix tidak akan berfungsi."
Peter Mortensen

3

Saya selalu menggunakan:

Salin & tempel

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

1
Op explicity menyatakan bahwa solusi Unix tidak berguna baginya.
Neutrino

Ini menganggap Linux atau yang serupa (misalnya MinGW atau Cygwin ). OP menyatakan: "Server saya menjalankan Windows Server 2003 sehingga solusi Unix tidak akan berfungsi."
Peter Mortensen

3

Karena posting ini ditandai Windows, saya pikir saya akan mencari solusi untuk Windows. Saya ingin mengotomatiskan prosesnya, dan saya membuat file bat. Saya menolak membuat console.exe di C #.

Saya ingin menambahkan file atau folder yang tidak ditambahkan dalam repositori saya ketika saya memulai proses komit.

Masalah dengan banyak jawaban adalah mereka akan mendaftar file tidak berversi yang harus diabaikan sesuai daftar abaikan saya di TortoiseSVN .

Ini adalah pengaturan hook dan file batch saya yang melakukan itu

Script Kait Kura-kura:

"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"

Dalam implementasi ini, Anda akan mendapat masalah jika folder / nama file Anda memiliki lebih dari satu ruang seperti di bawah ini:

"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"

kasus-kasus seperti itu dicakup dengan sederhana:

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

2

Jika Anda menggunakan Linux atau menggunakan Cygwin atau MinGW di windows Anda dapat menggunakan solusi mirip-bash seperti berikut ini. Berbeda dengan yang serupa lainnya yang disajikan di sini, yang ini memperhitungkan ruang nama file akun:

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

Untuk apa ini? CMD? Pesta? Sepertinya Bash (atau shell serupa). Dalam hal ini, ia menganggap Linux atau yang serupa (misalnya MinGW atau Cygwin ). OP menyatakan: "Server saya menjalankan Windows Server 2003 sehingga solusi Unix tidak akan berfungsi."
Peter Mortensen

Terima kasih, Anda benar, ketika saya di Windows saya menggunakan Cygwin dengan Bash. Namun pernyataan "Server saya menjalankan Windows Server 2003 sehingga solusi Unix tidak akan berfungsi." itu salah. Mungkin dia tidak ingin menggunakan Cygwin atau MinGW, tetapi dia tidak mengekspresikan dirinya dengan cara itu. Saya merumuskan kembali responsnya.
Paling bagus

1

Setelah menghabiskan waktu mencoba mencari cara menambahkan beberapa file secara rekursif, saya pikir akan sah untuk membagikan apa yang berhasil bagi saya:

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"

Ini dia penjelasannya.

Perintah pertama menambahkan semua direktori. Perintah kedua hanya menambahkan file sesuai dengan pola yang ditentukan.

Biarkan saya memberikan detail lebih lanjut:

  • UNTUK: Anda tahu, kontrol loop.
  • / F: berarti mengambil file dan direktori (tidak yakin persis).
  • % F: ini adalah variabel; itu akan mengasumsikan nilai masing-masing file yang terdaftar pada suatu waktu; itu bisa memiliki nama karakter satu lagi.
  • IN: tidak perlu dijelaskan, kan?
  • ('dir / s / b / a: d'): perintah DOS yang akan mendaftar direktori; dalam kasus saya / s bersifat rekursif, / b hanya mengambil path lengkap, / a: d berarti hanya direktori; ubahlah sesuai keinginan Anda menjaga tanda kurung dan apostrof.
  • DO: berarti apa yang datang selanjutnya dalam perintah adalah apa yang akan dieksekusi untuk setiap direktori
  • svn add --depth = kosong: ini adalah perintah SVN yang diinginkan untuk dijalankan; definisi kedalaman berarti hanya menambahkan direktori dan bukan file di dalamnya.
  • "% F": begitulah cara Anda menggunakan variabel yang ditentukan sebelumnya.

Pada perintah kedua, satu-satunya perbedaan adalah perintah dir dan perintah svn, saya pikir cukup jelas.


0

Anda bisa menggunakan perintah

svn add * force--

atau

svn add <directory/file name>

Jika file / direktori Anda tidak ditambahkan secara rekursif. Lalu periksa ini.

Menambahkan rekursif adalah properti default . Anda bisa lihat di buku SVN .

Masalah bisa ada di daftar abaikan Anda atau properti global.

Saya mendapat solusi pelacak masalah google

Periksa properti global untuk mengabaikan bintang (*)

  • Klik kanan pada repo Anda di jendela. Pilih TortoiseSVN > Properties.
  • Lihat apakah Anda tidak memiliki properti svn:global-ignores with a value of *
  • Jika Anda memiliki properti dengan star(*)itu akan mengabaikan penambahan rekursif. Jadi hapus properti ini.

Periksa pola abaikan global untuk mengabaikan bintang (*)

  • Klik kanan pada repo Anda di jendela. Pilih TortoiseSVN > Settings > General.
  • Lihat di Global Ignore Pattern, jika Anda tidak menetapkan bintang (*) di sana.
  • Jika Anda menemukan star(*), hapus properti ini.

Orang ini juga menjelaskan mengapa properti ini ditambahkan dalam proyek saya.

Cara paling suka yang ada di sana adalah seseorang mengklik kanan file tanpa ekstensi apa pun dan memilih TortoiseSVN -> SVN Abaikan -> * (secara rekursif), dan kemudian melakukan ini.

Anda dapat memeriksa log untuk melihat siapa yang melakukan perubahan properti, mencari tahu apa yang sebenarnya mereka coba lakukan, dan meminta mereka untuk lebih berhati-hati di masa depan. :)


0

Anda dapat memasukkan perintah berikut di Linux:

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

0

Karena ia menentukan Windows, di mana awk & sed tidak standar:

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

atau dalam file batch:

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

0

Ini adalah cara malas dan berbahaya untuk menyinkronkan direktori dengan SVN termasuk file baru:

svn rm --keep-local dir
svn add dir

Meskipun ini dapat bekerja dalam keadaan darurat, namun hal itu dapat memiliki konsekuensi serius juga. Sebagai contoh, SVN akan sering kehilangan jejak sejarah file.

Cara ideal untuk menyinkronkan direktori adalah untuk dapat melakukan diff lalu menggunakan svn patch, namun ini menyimpang dari format dalam perintah diff dan perintah svn diff akan membandingkan perbedaan direktori yang berfungsi daripada perbedaan pada tingkat sistem file.


-1

Saya pikir saya telah melakukan sesuatu yang mirip dengan:

svn add . --recursive

tapi tidak yakin apakah ingatanku benar ;-p


2
hanya pembaruan untuk memori Anda: svn 1.4 dan 1.5 tidak mendukung --recursive sebagai parameter untuk svn add :)
Ludwig Wensauer
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.