menggunakan gitignore untuk mengabaikan (tetapi tidak menghapus) file

98

Saya memiliki direktori tmp di repo git saya, saya ingin tetap ada, tetapi diabaikan. Saya menambahkannya ke .gitignore, tetapi git statusmasih memberi tahu saya tentang perubahan pada file di direktori itu. Saya mencoba git rm -r --cached, tetapi itu menghapusnya dari repo jarak jauh. Bagaimana cara menghentikan pelacakan perubahan ke direktori ini, tetapi tetap mengizinkannya? Saya juga perlu melakukan ini untuk 1 file, tetapi perubahan itu juga muncul git statussetelah .gitignoremereka. Apa yang harus saya lakukan?

21312312
sumber
1
tolong tuliskan seperti apa sebenarnya file .gitignore Anda?
kdehairy

Jawaban:

183

Sebagai gantinya .gitignore, Anda dapat memperbarui repositori git lokal dengan menjalankan perintah berikut:

git update-index --assume-unchanged <file>

Dalam hal ini file sedang dilacak di repo asal. Anda dapat memodifikasinya di repo lokal Anda dan git tidak akan pernah menandainya sebagai diubah. Baca lebih lanjut di:

ducin
sumber
22
Kecintaan saya pada git mungkin baru saja berlipat ganda.
Mark Fox
2
Ini harus menjadi jawaban yang diterima. Terima kasih telah menautkan ke itu.
Gowiem
4
Apakah ada cara untuk mendorong ini ke repo jarak jauh?
Brian Ortiz
2
hmm saya lebih suka menandai file sebagai "itu bukan file git, jangan pernah menyinkronkannya dengan git, bahkan di repo orang lain"
fantastory
11
Anda dapat mengembalikannya dengan git update-index --no-assume-unchanged <file>. Jika Anda ingin mendaftarnya git ls-files -v | grep '^h'.
Sanghyun Lee
12

Mengabaikan perubahan yang dibuat pada file sementara membiarkannya ada adalah tujuan sebenarnya dari .gitignore. Jadi menambahkan file (atau direktori) ke .gitignoreadalah satu-satunya hal yang harus Anda lakukan.

Tetapi masalah Anda adalah git sudah melacak file yang ingin Anda abaikan dan .gitignoretidak berlaku untuk file yang dilacak. Satu-satunya cara untuk menghentikan pelacakan ini adalah dengan memberi tahu git untuk menghapusnya. Dengan menggunakan git rm --cached, Anda mencegah git menghapus file lokal Anda, tetapi repositori lain yang mendapatkan perubahan akan menerapkan penghapusan. Saya tidak berpikir ada cara untuk menghindarinya dari repositori Anda sendiri. Anda harus melakukan sesuatu di repositori lain, atau menerima file akan dihapus.

Untuk mencegah penghapusan repositori satu sama lain, Anda dapat:

  • (jelas) buat cadangan file di suatu tempat, tarik perubahan dan pulihkan file,
  • atau juga git rm --cachedfile dan komit sebelum menarik perubahan Anda. Git akan menggabungkan dua penghapusan dengan baik tanpa menyentuh file yang sudah tidak terlacak.
Michaël Witrant
sumber
6
Itu tidak harus benar ("stop tracking = remove file"). Anda masih dapat memiliki file dilacak di repo dan tidak melihat perubahan apapun yang dibuat, dengan menggunakan: git update-index --assume-unchanged <file>. Lihatlah di: blog.pagebakers.nl/2009/01/29/…
ducin
ini memecahkan masalah saya karena saya perlu menghapus file dari repositori yang didorong di git jadi git rm --cached <filename> -r dan setelah push ini berubah ke repositori lagi sehingga file dihapus
Vinicius Cardoso
7

Letakkan a /di akhir nama direktori di .gitignorefile Anda , mis

tmp/

Jika telah melacak file di dalam direktori itu, Anda perlu memberi tahu git untuk melupakannya terlebih dahulu (sebelum Anda menambahkan dir ke daftar abaikan). Dengan asumsi Anda tidak memiliki apa pun yang penting di sana (yaitu Anda dapat menggaruknya):

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

File baru di direktori itu tidak akan dilacak.

The --cachedpilihan untuk git rmhanya bekerja pada indeks (tertunda perubahan yang lebih atau kurang). Ini tidak berpengaruh pada pohon kerja atau status apa yang telah dilacak atau tidak.

Tikar
sumber
Aku punya itu. Keduanya the/dir/danthe/dir/*
21312312
Hai Mat, jika saya memiliki sesuatu seperti / Media di folder berbeda yang ingin saya abaikan, apakah itu mungkin? Jadi suka / 1 / Media, / 2 / Media, terus sampai suka 99?
Nic
1

Kedengarannya seperti Anda mencoba untuk melacak file (misalnya index.php), menambahkannya ke repositori jarak jauh, kemudian berhenti menonton pelacakannya, sambil menyimpan file di remote (yaitu tetap index.phptidak berubah pada repo jarak jauh saat mengubahnya secara lokal).

Dari apa yang saya pahami, git tidak bisa melakukan ini. Anda dapat melacak file, atau tidak. Jika Anda melacak file, itu ada di repo jarak jauh, dan berubah ketika Anda melakukan perubahan padanya. Jika Anda tidak melacak file, itu tidak ada di repo jarak jauh.

Karena tidak mungkin melakukan apa yang Anda inginkan dengan git, ada kemungkinan solusi lain, bergantung pada situasi Anda. Misalnya, mengapa Anda tidak ingin index.phpmengubah di remote ketika Anda mengubahnya secara lokal? Apakah ada pengaturan khusus pengguna di file? Jika ini masalahnya, Anda dapat melakukan:

cp index.php index_template.php
git rm --cached index.php

Sekarang edit index_template.php menjadi seperti yang Anda inginkan untuk muncul di repo jarak jauh. Tambahkan sesuatu ke README Anda untuk memberi tahu orang-orang yang menggunakan repositori Anda bahwa setelah mereka menggandakannya, mereka harus menyalin index_template.php ke index.php dan mengeditnya sesuai dengan kebutuhan mereka.

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

Ketika seseorang mengkloning repo Anda, mereka harus membuatnya sendiri index.php. Anda telah membuatnya mudah untuk mereka: cukup salin index_template.phpke index.phpdan revisi dengan pengaturan khusus komputer.

Cypress Frankenfeld
sumber