git update-index --assume-unchanged di direktori

101

git 1.7.12

Saya ingin menandai semua file di bawah direktori tertentu sebagai asumsikan-tidak berubah.

1) git update-index --assume-unchaged dir/memberikan "Mengabaikan jalur."

2) git update-index --assume-unchaged dir/*cepat gagal karena akan menemukan file yang tidak dilacak, oleh karena itu memberikan "fatal: Tidak dapat menandai file" dan berhenti.

3) Coba buat daftar file untuk ditandai. cdke direktori yang diinginkan dan kemudian jalankan git ls-files | tr '\n' ' ' | git update-index --assume-unchanged. Ini tidak menghasilkan pesan kesalahan, tetapi tidak berhasil menandai file. Bagian pertama dari perintah`` git ls-files | tr '\n' ' 'dengan benar menghasilkan daftar yang dipisahkan spasi dari semua file yang ingin saya tandai. Jika saya menyalin dan menempelkan output dari perintah itu ke baris perintah, maka git update-indexperintah itu berfungsi. Apa yang tidak berfungsi dengan pipa?

Tidak, tidak cukup bagi saya untuk menambah dir.gitignore. Saya perlu file-file ini berada di repositori, tetapi perubahan yang tidak diinginkan akan dibuat secara lokal yang perlu diabaikan sehingga pengguna dapat melakukan penarikan.

Xander Dunn
sumber

Jawaban:

174

git update-index menginginkan nama file pada baris perintahnya, bukan pada input standarnya.

Langkah 1:

cd ke dalam folder yang Anda anggap tidak berubah

Langkah 2:

Anda dapat melakukan ini:

git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

atau

git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged

Meskipun, dengan kedua kasus tersebut, nama file dengan spasi akan bermasalah. Jika Anda memilikinya, Anda dapat menggunakan ini:

git ls-files -z | xargs -0 git update-index --assume-unchanged

Edit: memasukkan masukan dari @MatthewScharley tentang git ls-files -z.

Perintah Windows

Catatan: Jika Anda menggunakan windows, gunakan Git Bash untuk menjalankan perintah ini

twalberg.dll
sumber
2
FYI, bahwa `| tr '\ n' '' `` bit tidak diperlukan.
Václav Slavík
7
@twalberg: Anda bisa saja menggunakangit ls-files -z
Matthew Scharley
2
@twalberg Cara membatalkan perintah ini "git ls-file -z | xargs -0 git update-indeks --assume-berubah"
Mohamed Hussain
3
@MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchanged, saya akan berpikir ...
twalberg
1
git ls-files -z | git update-index -z --stdinlebih bersih.
Jed
22

The findperintah dari GNU findutils memiliki -execpilihan yang menghilangkan sebagian besar kerumitan menggunakan xargs, meskipun sintaks adalah sedikit istimewa. Namun itu menangani dengan sempurna nama file dengan spasi.

Perintah ini akan membuat git menganggap semua file di dalam dan di bawah direktori yang terdaftar tidak berubah:

find path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;

Find mengambil setiap argumen setelah -execsampai ;(yang Anda harus keluar agar shell Anda tidak memakannya) dan menjalankannya sekali untuk setiap file yang ditemukan, sambil mengganti {}(sekali lagi, satu kutipan sehingga shell Anda tidak akan memakannya) dengan nama file yang ditemukan.

Menggunakan findkriteria pencocokan (kedalaman rekursi maksimum, apakah yang cocok adalah file atau direktori, apakah nama file cocok dengan ekspresi) dan -execAnda dapat melakukan semua jenis hal yang berguna.

Tidak yakin tentang implementasi findperintah lainnya. YMMV.

theycallhimart
sumber
2
-execadalah opsi standar . Anda juga dapat -exec git update-index --assume-unchanged {} +(juga ditentukan oleh standar) yang meneruskan beberapa nama file ke perintah sekaligus, mengurangi berapa kali perintah git dipanggil.
Tom Fenech
16

Tambahkan nama direktori ke .git/info/exclude. Ini berfungsi untuk file yang tidak terlacak.

Steve Pitchers
sumber
Ini bekerja dengan baik! Tahukah Anda jika ini juga berfungsi dengan file?
betomoretti
Tetapi ini tidak mendorong file yang tidak terlacak ke github! apakah ada cara yang mungkin untuk mengabaikannya dari catatan tapi benar-benar menyimpannya di repo !?
Mahmoud Zalt
2

Ya,

git update-index --assume-unchanged

bekerja dengan file saja, tidak dengan direktori. Saya pikir, salah satu cara yang lebih cepat:

cd dir
ls | xargs -l git update-index --assume-unchanged
Victor Perov
sumber
2
Alih-alih menggunakan cd, Anda dapat melewati dir sebagai argumen akhir: git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR.
kzh