Bagaimana cara saya mengabaikan file di Subversion?

645

Bagaimana cara saya mengabaikan file di Subversion?

Juga, bagaimana cara menemukan file yang tidak di bawah kontrol versi?

andyuk
sumber
Sangat menyenangkan melihat bagaimana setiap pertanyaan sederhana (mungkin dari pengguna git) berarti banyak jawaban yang terlalu rumit. Jika ini terjadi, itu bayi Subversion.
Valerio Bozz

Jawaban:

738

(Jawaban ini telah diperbarui agar sesuai dengan perilaku SVN 1.8 dan 1.9)

Anda memiliki 2 pertanyaan:

Menandai file sebagai diabaikan:

Dengan "file yang diabaikan" Maksudku file tidak akan muncul dalam daftar bahkan sebagai "tidak berversi": klien SVN Anda akan berpura-pura file tidak ada sama sekali dalam sistem file.

File yang diabaikan ditentukan oleh "pola file". Sintaks dan format pola file dijelaskan dalam dokumentasi online SVN: http://svnbook.red-bean.com/nightly/en/svn.advanced.props.special.ignore.html "Pola File dalam Subversi".

Subversion, pada versi 1.8 (Juni 2013) dan yang lebih baru, mendukung 3 cara menentukan pola file. Berikut ringkasan dengan contoh:

1 - Area Konfigurasi Runtime - global-ignoresopsi:

  • Ini hanya pengaturan sisi klien , jadi global-ignoresdaftar Anda tidak akan dibagikan oleh pengguna lain, dan itu berlaku untuk semua repo yang Anda checkout ke komputer Anda.
  • Pengaturan ini didefinisikan dalam file Area Konfigurasi Runtime Anda:
    • Windows (berbasis file) - C:\Users\{you}\AppData\Roaming\Subversion\config
    • Windows (berbasis registri) - Software\Tigris.org\Subversion\Config\Miscellany\global-ignoresbaik dalam HKLMdan HKCU.
    • Linux / Unix - ~/.subversion/config

2 - svn:ignoreProperti, yang ditetapkan pada direktori (bukan file):

  • Ini disimpan dalam repo, sehingga pengguna lain akan memiliki file abaikan yang sama. Mirip dengan cara .gitignorekerjanya.
  • svn:ignorediterapkan ke direktori dan tidak rekursif atau diwariskan. File atau subdirektori langsung dari direktori induk yang cocok dengan Pola File akan dikecualikan.
  • Sementara SVN 1.8 menambahkan konsep "properti yang diwarisi", svn:ignoreproperti itu sendiri diabaikan dalam direktori turunan tidak langsung:

    cd ~/myRepoRoot                             # Open an existing repo.
    echo "foo" > "ignoreThis.txt"                # Create a file called "ignoreThis.txt".
    
    svn status                                  # Check to see if the file is ignored or not.
    > ?    ./ignoreThis.txt
    > 1 unversioned file                        # ...it is NOT currently ignored.
    
    svn propset svn:ignore "ignoreThis.txt" .   # Apply the svn:ignore property to the "myRepoRoot" directory.
    svn status
    > 0 unversioned files                       # ...but now the file is ignored!
    
    cd subdirectory                             # now open a subdirectory.
    echo "foo" > "ignoreThis.txt"                # create another file named "ignoreThis.txt".
    
    svn status
    > ?    ./subdirectory/ignoreThis.txt        # ...and is is NOT ignored!
    > 1 unversioned file
    

    (Jadi file ./subdirectory/ignoreThistidak diabaikan, meskipun " ignoreThis.txt" diterapkan pada .akar repo).

  • Karena itu, untuk menerapkan daftar abaikan secara rekursif Anda harus menggunakan svn propset svn:ignore <filePattern> . --recursive.

    • Ini akan membuat salinan properti di setiap subdirektori.
    • Jika <filePattern>nilainya berbeda dalam direktori anak, maka nilai anak itu sepenuhnya mengesampingkan orang tua, sehingga tidak ada efek "tambahan".
    • Jadi jika Anda mengubah <filePattern>pada root ., maka Anda harus mengubahnya dengan --recursivemenimpanya pada anak dan direktori turunan.
  • Saya perhatikan bahwa sintaks baris perintah bersifat kontra-intuitif.

    • Saya mulai dengan asumsi bahwa Anda akan mengabaikan file di SVN dengan mengetikkan sesuatu seperti svn ignore pathToFileToIgnore.txtnamun ini bukan cara kerja fitur diabaikan SVN.

3- svn:global-ignoresProperti. Membutuhkan SVN 1.8 (Juni 2013):

  • Ini mirip dengan svn:ignore, kecuali ia menggunakan fitur "properti yang diwarisi" SVN 1.8.
  • Bandingkan dengan svn:ignore, pola file secara otomatis diterapkan di setiap direktori turunan (bukan hanya anak-anak langsung).
    • Ini berarti bahwa tidak perlu diatur svn:global-ignoresdengan --recursiveflag, karena pola pengabaian yang diwarisi secara otomatis diterapkan saat mereka diwarisi.
  • Menjalankan set perintah yang sama seperti pada contoh sebelumnya, tetapi menggunakan svn:global-ignoressebagai gantinya:

    cd ~/myRepoRoot                                    # Open an existing repo
    echo "foo" > "ignoreThis.txt"                       # Create a file called "ignoreThis.txt"
    svn status                                         # Check to see if the file is ignored or not
    > ?    ./ignoreThis.txt
    > 1 unversioned file                               # ...it is NOT currently ignored
    
    svn propset svn:global-ignores "ignoreThis.txt" .
    svn status
    > 0 unversioned files                              # ...but now the file is ignored!
    
    cd subdirectory                                    # now open a subdirectory
    echo "foo" > "ignoreThis.txt"                       # create another file named "ignoreThis.txt"
    svn status
    > 0 unversioned files                              # the file is ignored here too!
    

Untuk pengguna TortoiseSVN:

Keseluruhan pengaturan ini membingungkan bagi saya, karena terminologi TortoiseSVN (seperti yang digunakan dalam sistem menu Windows Explorer mereka) pada awalnya menyesatkan bagi saya - saya tidak yakin apa pentingnya menu Abaikan "Tambah secara rekursif", "Tambah *" dan "Tambah" pilihan. Saya harap posting ini menjelaskan bagaimana fitur Abaikan terkait dengan fitur Properti SVN. Yang mengatakan, saya sarankan menggunakan command-line untuk mengatur file yang diabaikan sehingga Anda bisa merasakan bagaimana cara kerjanya daripada menggunakan GUI, dan hanya menggunakan GUI untuk memanipulasi properti setelah Anda merasa nyaman dengan command-line.

Mendaftar file yang diabaikan:

Perintah svn statusakan menyembunyikan file yang diabaikan (yaitu, file yang cocok dengan global-ignorespola RGA , atau cocok dengan svn:ignorepola direktori induk langsung atau cocok dengan pola direktori ancesor apa pun) svn:global-ignores.

Gunakan --no-ignoreopsi untuk melihat file-file tersebut terdaftar. File yang diabaikan memiliki status I, kemudian menyalurkan output grepke hanya menampilkan baris yang dimulai dengan "I".

Perintahnya adalah:

svn status --no-ignore | grep "^I"

Sebagai contoh:

svn status
> ? foo                             # An unversioned file
> M modifiedFile.txt                # A versioned file that has been modified

svn status --no-ignore
> ? foo                             # An unversioned file
> I ignoreThis.txt                  # A file matching an svn:ignore pattern
> M modifiedFile.txt                # A versioned file that has been modified

svn status --no-ignore | grep "^I"
> I ignoreThis.txt                  # A file matching an svn:ignore pattern

ta-da!

andyuk
sumber
6
Untuk menemukan file yang diabaikan: svn status -u -v --no-ign | grep "^ I" | awk "{print \ $ 2}"
Christian Madsen
3
jika Anda ingin mengabaikan file ./FolderA/FolderB/FileToIgnore, lakukan ini dari file Anda. folder: svn propset svn: abaikan "FileToIgnore" FolderA / FolderB /
jnj
8
jika Anda melakukan ssh'ing svn propedit svn:ignore .dan tidak ada editor teks yang dikonfigurasi, Anda akan mendapatkan pesan kesalahan yang mengatakan svn: E205007: Tidak ada variabel lingkungan SVN_EDITOR, VISUAL atau EDITOR yang ditetapkan, dan tidak ada opsi konfigurasi run-time 'editor-cmd' yang dijalankan ditemukan alih-alih membuat editor dibuka. Jadi tentukan saja --editor-cmd nano seperti inisvn propedit svn:ignore . --editor-cmd nano
Jonathan Morales Vélez
12
Anda juga dapat mengabaikan file dengan nama file tertentu di semua subfolder menggunakan argumen "- rekursif". yaitu svn propset svn: abaikan "* .jpg". --recursive
Templar
2
Alternatif sederhana untuk awk adalah grep:svn status | grep '^?'
Johnride
91

Gunakan perintah berikut untuk membuat daftar bukan di bawah file kontrol versi.

svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt

Kemudian edit file untuk meninggalkan hanya file yang sebenarnya ingin Anda abaikan . Kemudian gunakan yang ini untuk mengabaikan file yang tercantum dalam file:

svn propset svn:ignore -F ignoring.txt .

Perhatikan titik di akhir baris. Ini memberi tahu SVN bahwa properti sedang diset pada direktori saat ini.

Hapus file:

rm ignoring.txt

Akhirnya berkomitmen,

svn ci --message "ignoring some files"

Anda kemudian dapat memeriksa file mana yang diabaikan melalui:

svn proplist -v
ulitosCoder
sumber
2
Bagus. Perbaikan kecil adalah svn status | awk "/^?/ {print \$2}" > ignoring.txt.
Dirk Eddelbuettel
4
mengapa menghapus file? simpan dalam repo jika Anda perlu membuat kembali / menambah / menghapus
tgkprog
Catatan solusi ini tidak akan mengabaikan file dalam subdirektori (bahkan jika mereka muncul di ignoring.txt).
shaneb
Apakah itu akan tetap mengabaikan yang ada? Jika tidak, bagaimana melakukannya dalam satu perintah (yaitu --tidak mengabaikan dan menjaga juga garis yang didahului oleh I)?
a1an
Ini akan menimpa pengabaian Anda saat ini, coba: svn pg svn:ignore . >> ignore.txtsetelah perintah pertama untuk menambahkan pengabaian saat ini ke file.
ulitosCoder
55

.gitignore menyukai pendekatan

Anda dapat mengabaikan file atau direktori seperti .gitignore. Cukup buat file teks dari daftar direktori / file yang ingin Anda abaikan dan jalankan kode di bawah ini:

svn propset svn:ignore -F ignorelist.txt .

ATAU jika Anda tidak ingin menggunakan file teks, Anda dapat melakukannya seperti ini:

svn propset svn:ignore "first
 second
 third" .

Sumber: Blog Karsten - Set svn: abaikan untuk banyak file dari baris perintah

Adrian Enriquez
sumber
1
Perhatikan bahwa jika Anda kemudian memodifikasi file abaikan Anda, Anda perlu menjalankan kembali svn:ignoreperintahnya (lihat stackoverflow.com/a/58380306/189518 )
Sensei James
50

Jika Anda menggunakan TortoiseSVN , klik kanan pada file lalu pilih TortoiseSVN / Tambah untuk mengabaikan daftar . Ini akan menambahkan file / wildcard ke svn:ignoreproperti.

svn:ignoreakan diperiksa ketika Anda memeriksa file, dan file yang cocok akan diabaikan. Saya memiliki daftar abaikan berikut untuk proyek Visual Studio .NET:

bin obj
*.exe
*.dll
_ReSharper
*.pdb
*.suo

Anda dapat menemukan daftar ini di menu konteks di TortoiseSVN / Properties .

artur02
sumber
26

Seperti tak seorang pun tampaknya telah menyebutkannya ...

svn propedit svn:ignore .

Kemudian edit konten file untuk menentukan pola untuk diabaikan, keluar dari editor dan Anda sudah selesai.

Yorick
sumber
3
Jawaban ini bermanfaat. Dalam kasus saya, saya perlu mengubah "." ke sub-direktori file yang ingin saya abaikan dan hanya menentukan pola file. Juga, pertama kali, saya perlu menjalankan ini (saya di Mac): export SVN_EDITOR = "nano"
Elijah Lofgren
22

Saya menemukan artikel .svnignore Contoh untuk Java .

Contoh: .svnignore untuk Ruby on Rails,

/log

/public/*.JPEG
/public/*.jpeg
/public/*.png
/public/*.gif

*.*~

Dan setelah itu:

svn propset svn:ignore -F .svnignore .

Contoh untuk .gitignore. Anda dapat menggunakan untuk .svnignore Anda

https://github.com/github/gitignore

d.danailov
sumber
1
saya melakukan seperti yang Anda katakan ... tetapi ketika saya menjalankan status svn. masih menunjukkan file yang diabaikan dengan "?"
Harshit Gupta
Saya tidak pernah memeriksa dengan status svn, tetapi dengan svn add * dan setelah itu svn melakukan, mengabaikan file tidak dilakukan.
d.danailov
jika file "a.txt" sudah ada dalam kontrol versi, maka abaikan dilakukan dengan perintah seperti "svn propset svn: abaikan -F .svnignore a.txt"? Apakah itu benar ?
errakeshpd
Jika Anda menambahkan "a.txt" di file .svnignore Anda, saya tidak yakin, tetapi perintah harus benar.
d.danailov
10

Saat menggunakan propedit pastikan tidak memiliki spasi tambahan karena itu akan menyebabkan file dikeluarkan dari daftar abaikan.

Ini dimasukkan secara otomatis jika Anda telah menggunakan tab-autocomplete di linux untuk membuat file sebagai permulaan:

svn propset svn:ignore 'file1
file2' .
Kenneth
sumber
6
Ini hanya berfungsi untuk beberapa shell, seperti bash. Perhatikan bahwa menerbitkan kembali perintah propset menimpa set pola sebelumnya.
JA Faucett
Jadi file1 dan file2 harus terpisah?
IgorGanapolsky
8

Solusi lain adalah:

svn st | awk '/^?/{print $2}' > svnignore.txt && svn propget svn:ignore >> svnignore.txt && svn propset svn:ignore -F svnignore.txt . && rm svnignore.txt

atau baris demi baris

svn st | awk '/^?/{print $2}' > svnignore.txt 
svn propget svn:ignore >> svnignore.txt 
svn propset svn:ignore -F svnignore.txt . 
rm svnignore.txt

Apa fungsinya:

  1. Mendapat file status dari svn
  2. Menyimpan semua file dengan ? ke file "svnignore.txt"
  3. Mendapat file yang sudah diabaikan dan menambahkannya ke file "svnignore.txt"
  4. Memberitahu svn untuk mengabaikan file di "svnignore.txt"
  5. Menghapus file
bkbilly
sumber
8

Juga, jika Anda menggunakan Tortoise SVN Anda dapat melakukan ini:

  1. Dalam menu konteks pilih "TortoiseSVN", lalu "Properties"
  2. Di jendela yang muncul klik "Baru", lalu "Lanjutan"
  3. Di jendela yang muncul berlawanan dengan "Nama properti" pilih atau ketik "svn: abaikan", berlawanan dengan "Nilai properti" ketik nama file atau nama folder atau topeng file yang diinginkan (dalam kasus saya itu adalah "* / target"), klik "Terapkan properti secara rekursif "
  4. Baik. Baik.
  5. Melakukan
msangel
sumber
6
  1. cd ~ / .subversion
  2. konfigurasi terbuka
  3. temukan baris seperti 'pengabaian global'
  4. atur jenis file abaikan seperti ini: global-ignores = * .o * .lo * .la * .al .libs * .so .so. [0-9] * .pyc * .pyo 88 * .rej ~ # #. # *. *. swp .DS_Store output node_modules
范 陆 离
sumber
Terima kasih, jawaban Anda adalah satu-satunya yang menyebutkan configfile.
Henrique de Sousa
Jawaban ini menyebutkannya juga @HenriquedeSousa stackoverflow.com/a/86052/7724 dan juga menjelaskan bahwa ini adalah cara khusus klien untuk mengabaikan file.
bzlm
5

Jawaban bkbilly versi yang lebih mudah dibaca :

svn st | awk '/^?/{print $2}' > svnignore.txt
svn propget svn:ignore >> svnignore.txt
svn propset svn:ignore -F svnignore.txt .
rm svnignore.txt

Apa fungsinya:

  1. Mendapat file status dari svn
  2. Menyimpan semua file dengan ? ke file "svnignore.txt"
  3. Mendapat file yang sudah diabaikan dan menambahkannya ke file "svnignore.txt"
  4. Memberitahu svn untuk mengabaikan file di "svnignore.txt"
  5. Menghapus file
LivingDust
sumber
Saya suka jawaban bkbilly, tetapi versi ini memecah setiap baris untuk membuatnya lebih mudah dibaca, dan menghapus && yang dalam pengujian saya tidak melakukan apa-apa, karena baris pertama selalu membuat file sementara, dan file sementara yang sama ini selalu masuk ke daftar abaikan.
LivingDust
Proposisi edit akan lebih sesuai dalam kasus ini. Hargai upaya!
Jim
Saya belum memiliki reputasi yang cukup untuk menyarankan suntingan. tapi saya tidak ingin merusak protokol yang bagus. Apakah ada README sederhana pada pedoman untuk kapan sebaiknya menyarankan dan mengedit daripada mengirim jawaban baru dll?
LivingDust
1
Jika jawaban Anda persis sama dengan jawaban yang diposting satu setengah tahun yang lalu, itu cukup mudah. Anda bahkan menyalin penjelasan " Apa fungsinya ".
Jim
3

Anda juga dapat mengatur pola abaikan global dalam file konfigurasi SVN.

petr k.
sumber
1
Bisakah Anda mengatur pola abaikan untuk repositori tertentu?
David Doria
3

svn status akan memberi tahu Anda file mana yang tidak ada di SVN, dan juga apa yang berubah.

Lihatlah properti SVN untuk properti abaikan.

Untuk semua hal SVN, Buku Merah wajib dibaca.

DGM
sumber
2

Gunakan status perintah svn pada copy pekerjaan Anda untuk menunjukkan status file, file yang belum di bawah kontrol versi (dan tidak diabaikan) akan memiliki tanda tanya di sebelahnya.

Sedangkan untuk mengabaikan file Anda perlu mengedit properti svn: ign, baca bab Mengabaikan Item Tidak Berversi di svnbook di http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special.ignore. html . Buku ini juga menjelaskan lebih lanjut tentang penggunaan status svn.

Andreas Holstenson
sumber
2

SVN ignoremudah dikelola di TortoiseSVN. Buka TortoiseSVN dan klik kanan pada menu file kemudian pilih Tambahkan ke daftar abaikan.

Ini akan menambahkan file di svn:ignoreproperti. Ketika kami memeriksa file maka file yang cocok dengan svn:ignoreitu akan diabaikan dan tidak akan dilakukan.

Dalam proyek Visual Studio kami telah menambahkan file berikut untuk diabaikan:

bin obj
*.exe
*.dll
*.pdb
*.suo

Kami mengelola kode sumber pada SVN dari Comparetrap menggunakan metode ini dengan sukses

Kendur
sumber
2

Apa yang berhasil untuk saya:

Bagaimana cara saya mengabaikan file di Subversion?
1. Dalam File Explorer, klik kanan pada folder-nama proyek SVN
2. Klik pada "SVN Commit ..."
3.A "komit" akan muncul jendela
4. Klik kanan pada folder / file yang ingin Anda abaikan
5.Klik pada Tambah untuk mengabaikan daftar
6.Pilih folder / file
7.Komit "perubahan properti" ke SVN

Juga, bagaimana cara menemukan file yang tidak di bawah kontrol versi?
Setelah Langkah 3 di atas, klik "Tampilkan file tidak berversi"

jumping_monkey
sumber
0
  1. buka Anda menggunakan Produk JetBrains (yaitu Pycharm)
  2. lalu klik tombol 'komit' di bilah alat atas atau gunakan pintasan 'ctrl + k' tangkapan layar_toolbar
  3. pada antarmuka komit, pindahkan file yang tidak diinginkan Anda ke daftar perubahan lain sebagai berikut. tangkapan layar_commit_change
  4. lain kali Anda hanya dapat melakukan daftar perubahan default.
G. Googol
sumber