Bagaimana saya mengabaikan direktori dengan SVN?

760

Saya baru saja mulai menggunakan SVN, dan saya memiliki direktori cache yang tidak saya butuhkan di bawah kendali sumber. Bagaimana saya bisa mengabaikan seluruh direktori / folder dengan SVN?

Saya menggunakan Versi dan TextMate pada OS X dan commandline.

Gilean
sumber
3
Pertanyaan serupa dijawab di sini [folder abaikan checkout SVN] [1] [1]: stackoverflow.com/questions/192824/svn-checkout-ignore-folder
mloskot
Kemungkinan duplikat dari Bagaimana cara saya mengabaikan file di Subversion? (Saya tidak terlalu peduli ke arah mana duplikat pergi; tidak ada set jawaban yang jelas lebih baik dari yang lain.)
Jeffrey Bosboom

Jawaban:

796

Setel svn:ignoreproperti direktori induk:

svn propset svn:ignore dirname .

Jika Anda memiliki banyak hal untuk diabaikan, pisahkan dengan baris baru dalam nilai properti. Dalam hal ini, lebih mudah untuk mengedit nilai properti menggunakan editor eksternal:

svn propedit svn:ignore .
Jason Cohen
sumber
2
@Kouber: Masalah Anda adalah bahwa ekspansi shell tidak tahu tentang svn: abaikan properti. Jadi menggunakan '*' sebagai parameter explicityl melewati tmp ke perintah commit. Coba sesuatu seperti 'svn commit -m "Aksen lainnya".'
MarkusSchaber
4
Terima kasih atas jawabannya. Pico sebagai editor: svn propedit svn: abaikan. --editor-cmd pico
hade
157
Catatan: Ini tidak akan berfungsi jika direktori sudah "dalam" svn. svn rm --keep-local dirnamepertama. (Output svn stat saya sangat besar dan saya menabrak kepala saya untuk sementara waktu.)
Erik Aronesty
10
Jika Anda ingin mengabaikan lebih dari satu file / folder, tambahkan semua namanya ke file txt, masing-masing satu baris, dan gunakan varian berikut:svn propset svn:ignore -F file.txt .
petervaz
2
Berhati-hatilah agar Anda mengatur svn:ignoredan tidak svn::ignoreseperti yang saya lakukan. Anda dapat mengatur properti sewenang-wenang, sehingga yang terakhir akan diatur OK, dan Anda dapat melihat dan mengedit properti, tetapi itu tidak akan membuat SVN mengabaikan file yang Anda daftarkan.
Richard Turner
406

Berikut ini adalah contoh struktur direktori:

\project
    \source
    \cache
    \other

Ketika projectAnda melihat bahwa direktori cache Anda tidak ditambahkan dan muncul seperti itu.

> svn st
M  source
?  cache

Untuk mengatur properti abaikan, lakukan

svn propset svn: abaikan cache.

di mana svn:ignorenama properti yang Anda atur, cacheadalah nilai properti, dan .merupakan direktori tempat Anda menetapkan properti ini. Itu harus direktori induk dari cachedirektori yang membutuhkan properti.

Untuk memeriksa properti apa yang ditetapkan:

> svn proplist
Properties on '.':
  svn:ignore

Untuk melihat nilai svn:ignore:

> svn propget svn:ignore
cache

Untuk menghapus properti yang sebelumnya ditetapkan:

svn propdel svn:ignore
craigb
sumber
17
Satu poin rumit di sini yang membuat saya tersandung. Pastikan Anda tidak menambahkan garis miring pada dirname. Misalnya, saat mengetik svn propset svn:ignore dirname, jika Anda mengizinkan shell (bash) mengisi dirname untuk Anda, itu akan menambahkan garis miring itu, meninggalkan Anda dengan perintah svn propset svn:ignore dirname/, yang tidak mengakibatkan folder diabaikan. Setidaknya itu pengalaman saya.
David Weinraub
4
Dir 'cache' masih akan terdaftar di 'svn st'. Apakah ada cara untuk menghapusnya dari tampilan? (tanpa menghapus dari disk)
Tom Brito
131

Penting untuk disebutkan:

Di baris perintah Anda tidak dapat menggunakan

svn add *

Ini juga akan menambahkan file yang diabaikan, karena baris perintah diperluas *dan oleh karena itu svn addpercaya bahwa Anda ingin semua file ditambahkan. Karena itu gunakan ini sebagai gantinya:

svn add --force .
binco
sumber
lakukan persis seperti yang dikatakan @binco: svn add --force *TIDAK AKAN bekerja. Gunakan titik, bukan bintang.
manuell
80

Karena saya menghabiskan beberapa waktu untuk mencoba ini berfungsi, perlu dicatat bahwa jika file sudah ada di SVN, Anda perlu svn delete, dan kemudian edit svn:ignoreproperti.

Saya tahu itu tampak jelas, tetapi mereka terus muncul seperti ?dalam svn statusdaftar saya , ketika saya pikir itu akan mengabaikan mereka secara lokal.

Kai
sumber
8
Jangan lupa untuk menggunakan opsi --ke-lokal ketika menghapus file jika Anda hanya ingin mengabaikannya dan tidak benar-benar menghapusnya.
Dylan Holmes
71

Untuk sedikit berkembang, jika Anda melakukan ini dengan alat baris perintah svn, Anda ingin mengetik:

svn propedit svn:ignore path/to/dir

yang akan membuka editor teks pilihan Anda, lalu ketik '*' untuk mengabaikan semua yang ada di dalamnya, dan menyimpan + keluar - ini akan menyertakan direktori itu sendiri di svn, tetapi abaikan semua file di dalamnya, untuk mengabaikan direktori, gunakan jalur induk, dan kemudian ketikkan nama direktori dalam file. Setelah menyimpan, jalankan pembaruan ('svn up'), lalu periksa di jalur yang sesuai.

Greg
sumber
8
Poin yang sangat bagus, terima kasih. Semua jawaban lain merindukan kasus direktori bersarang. Jadi contoh di atas (berfungsi) Anda kemudian ketik editor ignored_directory (yang dengan asumsi satu tingkat di bawah path / to / dir). Ini tidak akan bekerja: svn propedit svn: abaikan. dan kemudian mengetik path / ke / dir / ignored_directory di editor. TKI: SVN mencocokkan objek satu tingkat ke bawah pada satu waktu.
greenoldman
30

Setel svn:ignoreproperti pada direktori induk:

$ cd parentdir
$ svn ps svn:ignore . 'cachedir'

Ini akan menimpa nilai saat ini dari svn:ignore. Anda mengedit nilai dengan:

$ svn pe svn:ignore .

Yang akan membuka editor Anda. Anda dapat menambahkan beberapa pola, satu pola per baris.

Anda dapat melihat nilai saat ini dengan:

$ svn pg svn:ignore .

Jika Anda menggunakan GUI, harus ada opsi menu untuk melakukan ini.

Frank Szczerba
sumber
3
svn ps svn:ignore . 'cachedir'hasil dalam cachedir is not under version control. berubah menjadi svn ps svn:ignore 'cachedir' .bekerja untuk saya
DiCaprio
21

Terima kasih atas semua kontribusi di atas. Saya hanya ingin berbagi beberapa informasi tambahan dari pengalaman saya sambil mengabaikan file.


Ketika folder sudah di bawah kendali revisi

Setelah svn mengimpor dan svn memasukkan file, apa yang biasanya kita lakukan untuk pertama kalinya.

Semua cache runtime, folder lampiran akan berada di bawah kontrol versi. jadi, sebelum svn ps svn: abaikan , kita perlu menghapusnya dari repositori.

Dengan SVN versi 1.5 di atas dapat kita gunakan svn del --keep-local your_folder, tetapi untuk versi sebelumnya, solusi saya adalah:

  1. svn ekspor salinan bersih folder Anda (tanpa .svnfolder tersembunyi)
  2. svn del lokal dan repositori,
  3. svn ci
  4. Salin kembali folder
  5. Apakah svn st dan konfirmasi folder ditandai sebagai '?'
  6. Sekarang kita bisa melakukan svn ps sesuai dengan solusinya

Ketika kita membutuhkan lebih dari satu folder untuk diabaikan

  • Dalam satu direktori saya memiliki dua folder yang perlu ditetapkan sebagai svn:ignore
  • Jika kita atur satu, yang lain akan dihapus.
  • Maka kita bertanya-tanya kita membutuhkan svn pe

svn peperlu mengedit file teks, dan Anda dapat menggunakan perintah ini jika diperlukan untuk mengatur editor teks Anda menggunakan vi :

export SVN_EDITOR=vi
  1. Dengan "o" Anda dapat membuka baris baru
  2. Ketikkan semua nama folder yang ingin Anda abaikan
  3. Tekan tombol 'esc' untuk keluar dari mode edit
  4. Ketik ": wq" lalu tekan Enteruntuk menyimpan dan keluar

File terlihat seperti ini:

runtime
cache
attachments
assets
Elliot Yap
sumber
Anda juga dapat menggunakan svn propset svn:ignore -F .ignorethesefiles ., yang akan menggunakan konten file. Saya suka menyimpannya agar Anda tahu apa yang diabaikan. Pengeditan memerlukan propset tindak lanjut.
Gerard ONeill
20

Hapus dulu ...

Jika direktori Anda foosudah di bawah kontrol versi, hapus dulu dengan:

svn rm --keep-local foo

... lalu abaikan:

svn propset svn:ignore foo .
Matt terbakar
sumber
12

... dan jika Anda ingin mengabaikan lebih dari satu direktori (katakan build/ temp/dan *.tmpfile), Anda bisa melakukannya dalam dua langkah (mengabaikan yang pertama dan mengedit properti abaikan (lihat jawaban lain di sini) atau satu dapat menulis sesuatu seperti

svn propset svn:ignore "build
temp
*.tmp" .

di baris perintah.

DerMike
sumber
12

Jika Anda menggunakan klien SVN tertentu TortoiseSVN , maka saat melakukan, Anda memiliki opsi untuk mengklik kanan item dan memilih "Tambahkan ke daftar abaikan".

Michael Lang
sumber
9

Perintah untuk mengabaikan banyak entri agak sulit dan membutuhkan backslash.

svn propset svn:ignore "cache\
tmp\
null\
and_so_on" .

Perintah ini akan mengabaikan apapun bernama cache, tmp, null, dan and_so_ondi direktori saat ini.

James Stroud
sumber
6
Dan hanya untuk memperjelas: Backslash di sini bukan fitur svn; itu hanya cara untuk memasukkan string multi-line pada shell. Anda juga dapat menggunakan editor dan cukup menulis beberapa baris.
sleske
Backslash tidak diperlukan untuk bash. bash cukup pintar untuk mengetahui bahwa "terbuka dan tidak memproses baris. Yang perlu Anda lakukan adalah tekan enter setelah cache, tmp, dan null. Anda akan melihat bahwa bash mengubah prompt ke> sehingga Anda tahu Anda masih memasukkan perintah. Alternatifnya adalah mulai mengetik perintah (svn), lalu tekan esc lalu v. Itu akan memungkinkan Anda untuk memasukkan perintah di editor. tekan ZZ ketika selesai menjalankan perintah. jika Anda berubah pikiran dan tidak ingin mengeksekusi, maka: q !.
Michael Potter
1
svn propset svn:ignore -F .ignorethesefiles .akan memungkinkan Anda untuk menggunakan file. Dan seperti yang disebutkan, Anda selalu memiliki propedit.
Gerard ONeill
5

Saya memiliki masalah membuat direktori bersarang untuk diabaikan; direktori teratas yang ingin saya abaikan tidak akan tampil dengan 'svn status' tetapi semua subdir melakukannya. Ini mungkin jelas bagi orang lain, tetapi saya pikir saya akan membagikannya:

CONTOH:

/bagasi

/ trunk / cache

/ trunk / cache / subdir1

/ trunk / cache / subdir2

cd /trunk
svn ps svn:ignore . /cache
cd /trunk/cache
svn ps svn:ignore . *
svn ci
brainycat
sumber
4

"Terima kasih" svn untuk cara yang begitu mengerikan, palsu dan sulit untuk mengabaikan file.

Jadi saya menulis skrip svn-ign-all :

#!/bin/sh

# svn-ignore-all

# usage: 
#   1. run svn status to see what is going on at each step 
#   2. add or commit all files that you DO want to have in svn
#   3. remove any random files that you don't want to svn:ignore
#   4. run this script to svn:ignore everything marked '?' in output of `svn status`

svn status |
grep '^?' |
sed 's/^? *//' |
while read f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

Juga, untuk mengabaikan daftar file / pathnames tertentu, kita dapat menggunakan varian svn-diabaikan ini . Saya kira svn-abaikan-semua harus benar-benar seperti xargs svn-abaikan.

#!/bin/sh

# svn-ignore

# usage:
#   svn-ignore file/to/ignore ...

for f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

Satu hal lagi: Saya cenderung mencemari checkout svn saya dengan banyak file acak. Ketika saatnya untuk melakukan, saya memindahkan file-file itu ke subdirektori 'lama', dan memberitahu svn untuk mengabaikan 'lama'.

Sam Watkins
sumber
Hei Sam, itu naskah yang bagus. Pertanyaan muncul di kepala saya: apakah mungkin masalahnya berasal dari kenyataan bahwa mengabaikan seluruh folder yang merupakan bagian dari repositori tidak berfungsi, jadi kita berakhir dengan '?' file yang pada dasarnya diubah file dalam folder yang kita tambahkan ke daftar abaikan? Saya hanya ingin tahu apakah ada cara di sekitar naskah Anda, karena akan membosankan untuk menjalankannya sepanjang waktu. Apakah kamu?
SquareCat
tidak, saya tidak benar-benar menggunakannya! coba bersihkan file-file saya
Sam Watkins
4

Bash oneliner untuk beberapa pengabaian:

svn propset svn:ignore ".project"$'\n'".settings"$'\n'".buildpath" "yourpath"
Fedir RYKHTIK
sumber
3

Jika direktori proyek Anda bernama / Proyek, dan direktori cache Anda bernama / Proyek / Cache, maka Anda perlu mengatur properti subversi pada / Proyek. Nama properti harus "svn: diabaikan" dan nilai properti harus "Cache".

Lihat halaman ini di manual Subversion untuk informasi lebih lanjut tentang properti.

Gabeg Digital
sumber
3

Jawaban Jason akan berhasil. Namun, alih-alih mengatur svn: abaikan ke "." pada direktori cache, Anda mungkin ingin memasukkan "cache" di svn direktori induk : abaikan properti, seandainya direktori cache tidak selalu ada. Saya melakukan ini pada sejumlah folder "sekali pakai".

harpo
sumber
3

UNTUK MENJAGA DIREKTUR YANG SVN AKAN MENGABAIKAN:

  1. ini akan menghapus file dari repositori, tetapi simpan direktori di bawah kontrol SVN:

svn hapus --keep-local path / directory_to_keep / *

  1. kemudian atur untuk mengabaikan direktori (dan semua konten):

svn propset svn: abaikan jalur "*" / directory_to_keep

sheasie
sumber
2

Jika Anda menggunakan frontend untuk SVN seperti TortoiseSVN, atau semacam integrasi IDE, harus ada opsi abaikan dalam menu yang sama dengan operasi komit / tambahkan.

Chris Marasti-Georg
sumber
1

Setel svn: abaikan properti . Sebagian besar alat svn UI memiliki cara untuk melakukan ini serta diskusi baris perintah di tautan.

Joe Skora
sumber
1

Karena Anda menggunakan Versi, sebenarnya sangat mudah:

  • Jelajahi salinan check-out Anda
  • Klik direktori untuk mengabaikan
  • Di kotak "Abaikan pada klik kanan Edit
  • Ketik *. * Untuk mengabaikan semua file (atau * .jpg hanya untuk file jpg, dll.)
Andrew
sumber
1

Saksikan garis miring Anda juga. Saya menemukan bahwa termasuk images/*dalam file pengaturan abaikan saya tidak mengabaikan ./images/. Ketika saya berlari svn status -umasih menunjukkan ? images. Jadi, saya baru saja mengubah pengaturan pengabaian menjadi adil images, tanpa garis miring. Menjalankan pemeriksaan status dan itu menghapusnya.

cdmo
sumber
1

Diselesaikan dengan Eclipse dengan cara berikut:

Pertama-tama, lakukan sinkronisasi folder Anda ke proyek:

tim -> sinkronisasi

Pada tampilan berikutnya, tampilan tim, Anda dapat melihat semua sumber daya yang dapat Anda komit ke server SVN.

Jadi, pilih folder sumber daya dari sumber daya yang ingin Anda abaikan, dan kemudian Anda dapat mengabaikannya menggunakan

tim -> tambahkan ke svn:ignore.

Setelah itu, di jendela konfirmasi, pilih opsi pertama: "abaikan menurut nama".

Misalnya, Jika saya ingin mengabaikan folder target dan sumber daya .class mereka, saya akan melakukan sinkronisasi, dan pada tampilan sinkronisasi, saya akan memilih folder target. Setelah itu, saya akan pilih

team-> add

ke svn:ignoredan kemudian saya akan mengkonfirmasi opsi pertama di jendela konfirmasi.

Antonio Martin
sumber
0

Setelah kehilangan banyak waktu mencari cara melakukan kegiatan sederhana ini, saya memutuskan untuk memposting itu tidak sulit untuk menemukan penjelasan yang layak.

Pertama biarkan struktur sampel

$ svn st? proyek / trunk / target? project / trunk / myfile.x

1 - pertama konfigurasikan editor, di mycase vim export SVN_EDITOR = vim

2 - "svn propedit svn: abaikan proyek / trunk /" akan membuka file baru dan Anda dapat menambahkan file dan subdirektori dalam diri kami ketik "target" simpan dan tutup file dan bekerja

$ svn st? project / trunk / myfile.x

Terima kasih.

Bruno Lee
sumber