Sinkronisasi ulang git repo dengan file .gitignore baru


192

Apakah mungkin untuk "menyegarkan" repositori git setelah memperbarui file gitignore?

Saya baru saja menambahkan lebih banyak ignorations (?) Ke gitignore saya dan ingin menghapus hal-hal yang sudah ada dalam repo yang cocok dengan file baru.



Bisa jadi, akankah solusi itu menghapus file yang sudah dikomit yang cocok dengan gitignore baru?
Christian Wattengård

100
+1 untuk menemukan kata "pengabaian".
Aasmund Eldhuset


1
@ user770: Hari ini saya belajar!
Aasmund Eldhuset

Jawaban:


372

Solusi yang disebutkan dalam " .gitignore file not ignoring " agak ekstrim, tetapi harus berfungsi:

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

( Pastikan untuk melakukan pertama perubahan Anda ingin menyimpan , untuk menghindari insiden apapun jball037 komentar di bawah ini .
The --cachedopsi akan menyimpan file-file Anda tersentuh pada disk Anda sekalipun.)

Anda juga memiliki solusi lain yang lebih bagus dalam posting blog " Membuat Git mengabaikan file yang sudah dilacak ":

git rm --cached `git ls-files -i --exclude-standard`

Bassim menyarankan dalam editnya :

File dengan ruang di jalurnya

Jika Anda mendapatkan pesan kesalahan seperti fatal: path spec '...' did not match any files, mungkin ada file dengan spasi di jalurnya.

Anda dapat menghapus semua file lain dengan opsi --ignore-unmatch:

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

tetapi file yang tidak cocok akan tetap ada di repositori Anda dan harus dihapus secara eksplisit dengan melampirkan path mereka dengan tanda kutip ganda:

git rm --cached "<path.to.remaining.file>"

Saya telah menemukan bahwa langkah git add tidak perlu, ketika saya menjalankan status git setelah git rm --cached, file yang dihapus sudah ada di area stage dan Anda bisa langsung melanjutkan dan mengkomitnya.
bab

3
Saya hanya menjalankan ini, kehilangan semua perubahan yang tidak dikomit, dan hampir mengumumkan pengunduran diri dari pekerjaan saya. Jawaban yang diterima pada utas ini menyelamatkan hidup saya: stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037

2
@VonC maaf, itu tidak dimaksudkan sebagai kata-kata kasar atau tongkat :) Tapi ya, saya menggunakan --cached dan semua perubahan saya tidak berkomitmen hilang ketika saya memeriksa file saya. Panik sesaat tapi "git reset HEAD" memulihkan file saya (tapi kali ini tanpa file yang saya tentukan di .gitignore, jadi solusi Anda masih berfungsi!)
jball037

3
@ jball037 Bagus. Saya telah menambahkan peringatan dan mengedit jawaban sesuai dengan itu.
VonC

1
jika saja saya membaca satu baris lebih jauh sebelum melakukan ini "(pastikan untuk melakukan lebih dulu perubahan yang ingin Anda pertahankan, untuk menghindari insiden apa pun sebagai jball037" #fml
Aiden Strydom

9

Saya mungkin salah paham, tetapi apakah Anda mencoba menghapus file yang baru saja diabaikan atau Anda ingin mengabaikan modifikasi baru pada file-file ini? Dalam hal ini, masalahnya berfungsi.

Jika Anda ingin menghapus file yang diabaikan sebelumnya yang dilakukan, maka gunakan

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'

Ada apa dengan tanda kutip tunggal di sini?
IgorGanapolsky

Ini adalah jawaban yang bagus
Holene

Ini adalah alasan yang sangat sederhana untuk menghapus file setelah saya memperbarui .gitignore saya. Namun perlu beberapa pembaruan kecil: `` git rm -cached git ls-files -i –exclude-standard git commit -m 'bersih-bersih ``
Aaron

1

Saya tahu ini adalah pertanyaan lama, tetapi solusi gracchus tidak berfungsi jika nama file berisi spasi. Solusi VonC untuk mengajukan nama dengan spasi adalah dengan tidak menghapusnya menggunakan --ignore-unmatch, kemudian menghapusnya secara manual, tetapi ini tidak akan berfungsi dengan baik jika ada banyak.

Berikut ini adalah solusi yang memanfaatkan bash array untuk menangkap semua file.

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

git commit -m 'ignore update'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.