SVN: Abaikan beberapa direktori secara rekursif

106

Saya tidak ingin direktori bernama buildatau distmasuk ke SVN saya tidak peduli seberapa dalam pohon itu.

Apakah ini mungkin? In git saya baru saja menempatkan

build
dist

di saya .gitignoredi root dan secara rekursif mengabaikan. Bagaimana saya melakukan ini dengan svn? Tolong jangan beri tahu saya untuk membuat alat peraga di setiap dir ...

Paul Tarjan
sumber
Periksa jawaban ini untuk solusi asli jika Anda menggunakan Subversion 1.8.
Frank Kusters

Jawaban:

57

Mulai subversi 1.8, sekarang ada svn:global-ignoresproperti yang berfungsi seperti svn:ignoretetapi secara rekursif (jadi setel ini di direktori level teratas Anda)

kembar
sumber
3
Saya agak bingung - ada global-ignoresdi ~/.subversion/configfile, tetapi juga properti yang diwariskan yang svn:global-ignores ditetapkan pada direktori di repo SVN, serta svn:ignore- dapatkah Anda memberikan ringkasan tentang opsi yang berbeda ini dan bagaimana perbandingannya? Bagaimana --recursivebendera mempengaruhi mereka juga?
Dai
2
Saya telah melakukan penelitian saya sendiri dan menerbitkan temuan saya dalam jawaban QA ini: stackoverflow.com/a/86052/159145
Dai
[Saya sudah mencoba tetapi gagal, objfolder masih muncul] ( stackoverflow.com/questions/50960188/… ), dapatkah Anda membantu saya untuk melihatnya?
Lukas
Dapatkah saya mengatakan "build / *" abaikan semua yang ada di bawah build dalam setiap folder build?
Johannes Schaub - litb
45

svn propsetmengambil --recursivesebagai opsi, sehingga Anda dapat melakukan ini, dengan dua kelemahan:

  1. Anda harus memeriksa seluruh repositori (atau setidaknya semua direktori di dalamnya), dan
  2. Anda harus ingat untuk menyetel svn:ignoreproperti setiap kali Anda menambahkan direktori baru
Michael Hackner
sumber
42

Tidak mungkin melakukan ini. Hanya ada dua mekanisme pengabaian di Subversion, svn:ignore(yang tidak rekursif) dan global-ignores(yang tidak spesifik untuk repositori).

Kevin Reid
sumber
7
svn propset --recursive svn: abaikan svn_ignore_rules. di mana svn_ignore_rules adalah file yang berisi aturan abaikan - satu per baris
georg
3
'svn propset --recursive svn: ignore --file svn_ignore_rules.' bagi saya dengan svn-1.7.6, kalau tidak Anda secara rekursif mengabaikan file bernama 'svn_ignore_rules' [edit: sesuai 'wytten' dalam komentar di bawah]
elbeardmorez
9
Kepada pemberi komentar: Seperti yang dikatakan penanya, "Tolong jangan suruh saya membuat alat peraga di setiap dir orang tua ...".
Kevin Reid
5
Sekarang dimungkinkan dalam Subversion 1.8
Squirrel
17

Ini bekerja untuk saya:

 svn propset --recursive svn:ignore *.zip <dir_tree_with_no_zips>
Stewart
sumber
2
Terima kasih untuk ini, berfungsi dengan baik ... Ngomong-ngomong, satu-satunya cara saya mengabaikan * .txt dan * .pdf adalah dengan meletakkan pola-pola itu dalam sebuah file dan kemudian menggunakan opsi 'svn propset --file'
wytten
13

tambahkan ke file ~ / .subversion / config atau / etc / subversion / config:

[miscellany]
global-ignores = build dist
jspcal.dll
sumber
Saya lebih suka melakukannya per repo jika saya bisa
Paul Tarjan
1
hmm tidak yakin apakah ada cara mudah untuk melakukannya per-repo, pengait pra-komit dapat menolak pola tertentu, tapi ini bukan solusi lengkap. svn: ignore pada setiap dir induk bekerja, tetapi tidak secara rekursif. Anda dapat menukar file konfigurasi Anda dengan skrip saat mengerjakan repo yang berbeda, tetapi itu adalah langkah tambahan.
jspcal
1
Apa yang dimaksud dengan build dist ?
IgorGanapolsky
9

Anda dapat mengabaikan direktori build dan dist dengan menghapus direktori dari kontrol versi. Triknya adalah dengan menggunakan opsi --keep-local untuk meninggalkan direktori dalam copy pekerjaan. Sebagai contoh:

svn rm dist --keep-local
svn ci -m'removed build directory from version control'

Direktori tidak akan lagi dilacak oleh subversi tetapi akan tetap ada di copy pekerjaan Anda untuk menampung keluaran kompilator, dll.

tepuk tangan, joe

jsharit.dll
sumber
7

Misalnya struktur folder:

Project/
Project/dist/

cd Project
svn propset svn:ignore '*' dist/
svn ci -m "content of dist ignored"

Sebaiknya lakukan penghapusan svn dari konten dist sebelum perintah ignore, jadi untuk cabang dist akan kosong.

Bekerja untuk saya, diuji hari ini. Ini adalah halaman yang menjelaskan sedikit

marian
sumber
6

Untuk mengabaikan semua file semacam itu di semua repositori, Anda dapat menambahkan a global-ignoreske file konfigurasi per pengguna Anda.

Pada sistem mirip Unix, area ini muncul sebagai direktori bernama .subversion di direktori home pengguna. Pada sistem Win32, Subversion membuat folder bernama Subversion, biasanya di dalam area Data Aplikasi direktori profil pengguna

Lihat Opsi Konfigurasi

Sayangnya, tidak ada opsi per repositori untuk melakukan ini. Ini pada dasarnya per pengguna, atau per direktori, jadi kelipatannya svn:ignoresmungkin cara yang harus dilakukan, sesulit mungkin.

Blair Conrad
sumber
1
Saya lebih suka melakukannya per repo jika saya bisa
Paul Tarjan
Oh, Anda kurang beruntung. Seperti yang dikatakan @Kevin Reid - Anda memiliki per direktori atau per pengguna.
Blair Conrad
6

Pertama-tama Anda harus pindah ke folder teratas dari copy pekerjaan Anda dan membuat file di sana (katakanlah .svnignore) di mana Anda harus menempatkan semua pola yang ingin Anda abaikan, misalnya (untuk proyek Android):

bin
gen
proguard
.classpath
.project
local.properties
Thumbs.db
*.apk
*.ap_
*.class
*.dex

Kemudian Anda menjalankan perintah berikut (ingat bahwa Anda harus berada di folder teratas dari copy pekerjaan Anda):

svn propset svn:ignore -R -F .svnignore .

Ini hanya akan berfungsi untuk folder dan file yang belum berada di bawah kendali versi. Jika Anda ingin folder (atau file) yang sedang diversi mulai diabaikan juga, hapus dari kontrol versi dengan menjalankan perintah:

svn rm --keep-local <path>

Dapatkan semua ini dari artikel hebat ini yang menjelaskan semuanya: http://superchlorine.com/2013/08/getting-svn-to-ignore-files-and-directories/

Luccas Correa
sumber
Ini sangat membantu. Ini adalah cara terbaik yang saya temukan untuk mendapatkan perilaku pengabaian seperti git di svn. Terima kasih banyak.
Jonathan Wilson
6

Dalam subversi 1.8 di atas, dimungkinkan untuk menyetel pengabaian global untuk repositori saat ini.

svn propset svn:global-ignores build .
svn propset svn:global-ignores dist .

Anda juga dapat membuat folder bernama .svnignore, dan menulis kondisi.

build
dist

ingat satu kondisi per baris, pengaturan build / * atau dist / debug akan sia-sia. Kemudian lakukan perintah:

svn propset svn:global-ignores -F .svnignore .
John Zhu
sumber
bekerja dengan sempurna! jalankan saja perintah pertama pada repo yang baru diperiksa.
gaurav
3

Buat file dan tambahkan pengabaian Anda ke dalamnya

ingore-list:

file1 
directory1
file2
etc...

kemudian terapkan perintah berikut

for n in directory; do svn propset svn:ignore -F ignore-list $n; done

direktori adalah nama direktori Anda, Anda dapat mengkategorikan juga direktori / sub-direktori. Atau gunakan * untuk mencatat direktori Anda saat ini.

Ini dengan asumsi Anda menggunakan bash sebagai shell Anda

jncc99
sumber
Berapa $ n di sini?
IgorGanapolsky
1
@igor Ganapolsky - $ n adalah variabel dari perulangan for. Ini akan ditetapkan sebagai indeks untuk urutan yang Anda perulangan; dalam hal ini direktori seperti yang ditentukan oleh "direktori" pada contoh di atas.
jncc99
3
svn propset --recursive svn:ignore svn_ignore_rules .

di mana svn_ignore_rules adalah file yang berisi aturan abaikan - satu per baris

Tentu saja Anda harus menjalankannya kembali setiap kali Anda menambahkan direktori baru ke repo Anda

svn_ignore_rules juga dapat dianggap diperiksa ke dalam repo, agar dapat digunakan kembali oleh pengguna lain yang memiliki akses tulis ke repo

georg
sumber
2
cd parent_dir # direktori yang berisi folder untuk diabaikan secara rekursif
svn propedit svn: abaikan. #akan membuka svn-prop.tmp
daftar folder
^ X
Y
komit -m 'abaikan direcoty yang ditargetkan'
Moin Haidar
sumber
membantu saya, saya mengalami masalah dengan pengaturan pola folder, SVN memenuhi folder itu tidak dalam repo set EDITOR=notepad,, svn propedit svn:ignore .bekerja dengan baik ...
Betlista
1

Karena sepertinya tidak ada solusi untuk masalah yang mungkin umum ini, saya ingin membagikan solusi kami. Seperti yang telah dijelaskan oleh yang lain, Anda dapat menggunakan svn:ignoreproperti, ini berlaku untuk satu direktori (dan oleh karena itu bukan untuk yang baru), atau Anda menggunakan global-ignoresyang berlaku untuk satu pengguna (tetapi bukan milik repositori).

Untuk membuat hidup sedikit lebih mudah saya membuat file reg bernama Settings.Svn.regdan menambahkannya ke root repositori. Sekarang semua orang dapat mengklik ganda regfile ini sekali, dan pengaturannya sudah selesai.

REGEDIT4

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany]
"global-ignores"="obj *.suo *.bak *.pdb *.user *.Cache*"

Saya akan sangat menghargai solusi dalam repositori SVN, jadi jika ada yang tahu, maukah Anda membagikannya?

martinstoeckli.dll
sumber
0

Salah satu caranya adalah dengan menambahkan beberapa jenis cek ke hook sebelum atau sesudah komit tetapi itu akan dicatat langsung jika Anda tidak memiliki server repo.

8DH
sumber