Rsync kecuali folder .svn dan sub-kontennya?

10

Berurusan dengan repo subversi dan pengguna baru yang tidak mengerti cara kerjanya.

Singkat cerita, karena struktur lokal mereka berantakan karena menyalin folder .svn acak tentang, saya melakukan hal berikut:

  • menyalin struktur lokal ke folder yang disebut staging
  • secara rekursif menghapus semua folder .svn dari direktori staging
  • memeriksa repo ke "folder bersih"

Sekarang kita berada pada langkah terakhir - mendapatkan isi folder pementasan untuk menimpa konten bersih.

Saya perlu perintah menyalin isi direktori pementasan ke direktori bersih, menghapus semua yang hanya ada di direktori bersih, TETAPI meninggalkan folder .svn folder bersih dalam kebijaksanaan.

Ini terdengar seperti pekerjaan untuk rsync. Apakah perintah berikut ini benar?

rsync -avr --exclude=.svn* [staging] [clean]
SeanKilleen
sumber
6
Anda selalu dapat menjalankan rsyncdengan --dry-runopsi untuk mencari tahu!
Tim
Hahaha terima kasih! Tidak tahu opsi itu ada. Seharusnya membaca pria itu lebih hati-hati!
SeanKilleen

Jawaban:

31

The -Cpilihan untuk rsync mungkin apa yang Anda inginkan.

Jangan biarkan deskripsi singkat di halaman manual menipu Anda. Tampaknya opsi hanya berlaku untuk CVS, tetapi tergantung pada versi rsync Anda, itu akan melewatkan file dari hampir setiap sistem kontrol versi umum yang ada.

# rsync version: 3.0.7

-C, --cvs-exclude           auto-ignore files in the same way CVS does

...

          The exclude list is initialized to exclude the  following  items
          (these  initial  items are marked as perishable — see the FILTER
          RULES section):

                 RCS  SCCS  CVS  CVS.adm   RCSLOG   cvslog.*   tags   TAGS
                 .make.state  .nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak
                 *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so  *.exe
                 *.Z *.elc *.ln core .svn/ .git/ .bzr/

          then,  files  listed in a $HOME/.cvsignore are added to the list
          and any files listed in the CVSIGNORE environment variable  (all
          cvsignore names are delimited by whitespace).
Sakit kepala
sumber
2
Berhati-hatilah, karena ekstensi ini dapat digunakan untuk file yang ingin Anda salin, mis. *.aadalah untuk iOS Static Libraries.
Max Chuquimia
File dan direktori NB dikecualikan: folder apa pun yang disebut "inti" tidak disalin misalnya / myproj / api / / myproj / core / <- tidak didukung!
teknopaul
7

Hampir - ini seharusnya

rsync -av --exclude='.svn*' [staging] [clean]

atau bentuk kutipan lainnya yang mencegah shell dari memperluas wildcard. (Wildcard hanya akan cocok dengan file yang tidak biasa yang namanya dimulai dengan --exclude=.svn, tetapi lebih baik untuk tidak mengambil risiko, dan juga untuk bekerja dengan benar bahkan jika shell dikonfigurasi untuk tersedak wildcard yang tidak cocok atau untuk memperluasnya ke daftar kosong. )

-rsudah termasuk dalam -a. Ekstra rhanya berlebihan, tidak akan membahayakan.

--excludemenyebabkan file yang cocok dengan argumennya tidak disalin, atau dipertimbangkan untuk traversal rekursif. Kesulitan yang biasa terjadi dengan rsync adalah sebaliknya, tidak termasuk direktori kecuali untuk bagian tertentu. Lihat filter Rsync: menyalin satu pola saja untuk beberapa tips.

Dalam kasus khusus ini, mengecualikan direktori kontrol versi adalah cara cepat untuk mendapatkan apa yang Anda inginkan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber