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.

Christian Wattengård
sumber
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
3
en.wiktionary.org/wiki/ignoration @AasmundEldhuset resmi
Daniel Springer
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>"
VONC
sumber
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'
Gracchus
sumber
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'
Jason
sumber