Bagaimana cara membuat Git "lupa" tentang file yang dilacak, tetapi sekarang ada di .gitignore?

Ada file yang dilacak oleh git , tetapi sekarang file tersebut ada dalam daftar .gitignore .

Namun, file ini terus ditampilkan dalam git status setelah mengeditnya. Bagaimana Anda membuat git benar-benar melupakannya?

4082
13 авг. mengatur Ivan 13 Agustus. 2009-08-13 22:23 '09 pada 10:23 2009-08-13 22:23
@ 22 jawaban

.gitignore mencegah file yang tidak terlacak ditambahkan (tanpa add -f ) ke set file yang dilacak oleh git, tetapi git akan terus melacak file apa pun yang sudah dilacak.

Untuk berhenti melacak file, Anda harus menghapusnya dari indeks. Ini dapat dicapai dengan menggunakan perintah ini.

 git rm --cached <file> 

Menghapus file dari tajuk revisi akan terjadi di komit berikutnya.

CATATAN: Meskipun ini tidak akan menghapus file fisik dari file lokal Anda, itu akan menghapus file dari mesin pengembang lain dengan git pull berikutnya.

4329
13 авг. Balas diberikan oleh CB Bailey 13 Agustus 2009-08-13 23:40 '09 pada 11:40 malam 2009-08-13 23:40

Dalam urutan perintah di bawah ini, semua item dari indeks Git akan dihapus (bukan dari direktori kerja atau repo lokal), dan kemudian indeks Git akan diperbarui, sementara Git akan diabaikan. Ps. Indeks = Cache

Pertama:

 git rm -r --cached . git add . 
border=0

Lalu:

 git commit -am "Remove ignored files" 
2209
30 сент. Jawabannya diberikan oleh Matt Frear 30 September . 2013-09-30 16:51 '13 pada 16:51 2013-09-30 16:51

git update-index melakukan semua pekerjaan untuk saya:

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

Catatan Solusi ini sebenarnya tidak tergantung pada .gitignore karena gitignore hanya ditujukan untuk file yang tidak .gitignore .

ubah: sejak respons ini dipublikasikan, opsi baru dibuat, dan ini harus lebih disukai. Anda harus menggunakan --skip-worktree yang ditujukan untuk file terpantau yang dimodifikasi yang tidak ingin diperbaiki oleh pengguna, dan menyimpan --assume-unchanged untuk kinerja yang lebih baik, sehingga git tidak memeriksa status file besar yang dipantau. Lihat encoreci.net.site/questions/1817 / ... untuk informasi lebih lanjut ...

 git update-index --skip-worktree <file> 
830
27 нояб. jawabannya diberikan Konstantin 27 November. 2013-11-27 14:24 '13 pada 14:24 2013-11-27 14:24
 git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached git commit -am "Remove ignored files" 

Ini mengambil daftar file yang diabaikan dan menghapusnya dari indeks, dan kemudian melakukan perubahan.

237
24 мая '14 в 1:29 2014-05-24 01:29 Jawabannya diberikanoftoft 24 Mei '14 jam 1:29 2014-05-24 01:29

Saya selalu menggunakan perintah ini untuk menghapus file yang tidak dapat diputar ini. Single-line, Unix-style, output bersih:

 git ls-files --ignored --exclude-standard | sed 's/.*/" | xargs git rm -r --cached 

Ini mencantumkan semua file Anda yang diabaikan, diganti dengan baris dengan tanda kutip alih-alih setiap baris output untuk memproses jalur dengan spasi di dalam dan meneruskan semuanya ke git rm -r --cached untuk menghapus path / file / direktori dari indeks.

62
19 июня '15 в 18:42 2015-06-19 18:42 Jawaban diberikan oleh David Hernandez pada 19 Juni '15 pukul 18:42 2015-06-19 18:42

Jika Anda tidak dapat git rm file yang dipantau karena orang lain mungkin membutuhkannya (peringatan, bahkan jika Anda menekan git rm --cached ketika orang lain menerima perubahan ini, file-file itu akan dihapus dalam sistem file mereka). Ini sering dilakukan karena mengganti file konfigurasi, kredensial otentikasi, dll. Silakan lihat https://gist.github.com/1423106 untuk mengetahui cara orang melewati masalah.

Singkatnya:

  • Mintalah aplikasi Anda untuk menemukan file config-overide.ini yang hi>
  • Perbaiki file config-sample.ini dan abaikan file config.ini, jika perlu, buat skrip atau file serupa untuk disalin.
  • Coba gunakan gitattributes clean / smudge magic untuk menerapkan dan menghapus perubahan, misalnya, mengaburkan file konfigurasi sebagai ekstrak dari cabang alternatif dan menghapus file konfigurasi sebagai ekstrak dari HEAD. Ini adalah hal yang sulit, saya tidak merekomendasikannya untuk pengguna pemula.
  • Simpan file konfigurasi di cabang penyebaran khusus, yang tidak akan pernah digabungkan dengan master. Saat Anda ingin menggunakan / mengkompilasi / menguji, Anda bergabung dengan cabang ini dan mendapatkan file ini. Pada dasarnya, ini adalah pendekatan noda / bersih, dengan pengecualian menggunakan orang menggabungkan kebijakan dan modul git tambahan.
  • Anti-recommender: jangan menggunakan asumsi tanpa perubahan, itu hanya akan berakhir dengan air mata (karena kebohongan palsu itu sendiri dapat menyebabkan hal-hal buruk, seperti perubahan Anda akan hi>
53
19 июля '12 в 3:08 2012-07-19 03:08 Jawaban diberikan oleh Seth Robertson pada 19 Juli '12 pada 3:08 2012-07-19 03:08

gerakkan, kunci, lalu kembalikan. Itu berhasil bagi saya di masa lalu. Mungkin ada cara bagi gittier untuk melakukan ini.

51
13 авг. Balas diberikan oleh Joel Hooks 13 Agustus 2009-08-13 22:27 '09 pada 10:27 2009-08-13 22:27

Gunakan ini saat:

1. Anda ingin memformat banyak file atau

2. Anda telah memperbarui file gitignore Anda

Tautan sumber: http://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/

Misalkan Anda telah menambahkan / mentransfer beberapa file ke repositori git Anda, dan kemudian menambahkannya ke your.gitignore; file-file ini akan tetap ada di indeks repositori Anda. Pada artikel ini kita akan melihat bagaimana cara menghi>

>

Sebelum melanjutkan, pastikan bahwa semua perubahan Anda dilakukan, termasuk file .gitignore.

>

Untuk menghapus repo Anda, gunakan:

 git rm -r --cached . 
  • rm - hapus perintah
  • -r akan memungkinkan penghapusan rekursif
  • -Cached Hanya akan menghapus file dari indeks. File Anda akan tetap ada di sana.

Perintah rm mungkin tidak dapat dijalankan. Jika Anda ingin mencoba apa yang dilakukan sebelumnya, tambahkan -n atau --dry-run untuk memeriksa semuanya.

>
 git add . 

>
 git commit -m ".gitignore fix" 

Repositori Anda bersih :)

Klik pada perubahan pada remote control untuk melihat perubahan yang juga efektif di sana.

40
22 апр. Balas diberikan oleh Dheeraj Bhaskar pada 22 April 2018-04-22 21:11 '18 jam 9:11 malam 2018-04-22 21:11

Apa yang tidak berhasil untuk saya

(Di Linux) Saya ingin menggunakan pesan yang menyarankan pendekatan ls-files --ignored --exclude-standard | xargs git rm -r --cached ls-files --ignored --exclude-standard | xargs git rm -r --cached Namun, (beberapa) file yang akan dihapus memiliki karakter baris baru / LF / \n tertanam dalam namanya. Tidak ada solusinya:

 git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached git ls-files --ignored --exclude-standard | sed 's/.*/" | xargs git rm -r --cached 

hadapi situasi ini (dapatkan kesalahan tentang file yang tidak ditemukan).

Karena itu, saya sarankan

 git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached 

Ini menggunakan argumen -z untuk ls-file , dan argumen -0 menggunakan xargs untuk digunakan dengan aman / benar untuk karakter "jahat" dalam nama file.

Halaman manual git-ws-files (1) menyatakan:

Jika opsi -z tidak digunakan, karakter TAB, LF, dan backslash di pathnames masing-masing direpresentasikan sebagai \ t, \ n, dan \\.

jadi saya pikir solusi saya diperlukan jika nama file berisi salah satu karakter ini.

EDIT: Saya diminta untuk menambahkan itu --- seperti perintah git rm - harus diikuti oleh commit untuk membuat penghapusan permanen, misalnya. git commit -am "Remove ignored files" .

38
29 дек. Jawaban diberikan oleh JonBrave pada 29 Desember. 2015-12-29 15:50 '16 pada 15:50 2015-12-29 15:50

Saya melakukan ini menggunakan cabang git dari filter . Perintah persis yang saya gunakan diambil dari halaman manual:

PERINGATAN : ini akan menghapus file dari seluruh riwayat.

 git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD 

Perintah ini menciptakan kembali seluruh sejarah komit dengan menjalankan git rm sebelum komit masing-masing dan dengan demikian membuang file yang ditentukan. Ingatlah untuk melakukan cadangan sebelum menjalankan perintah, karena akan hi>

35
13 авг. jawabannya diberikan drrlvn 13 Agustus. 2009-08-13 22:35 '09 pada pukul 10:35 2009-08-13 22:35
  • Perbarui file .gitignore - misalnya, tambahkan folder yang tidak ingin Anda lacak .gitignore .

  • git rm -r --cached . - hapus semua file yang dilacak, termasuk yang tidak diinginkan dan yang tidak diinginkan. Kode Anda akan aman jika Anda menyimpannya secara lokal.

  • git add . - Semua file akan ditambahkan kembali, kecuali yang ditentukan dalam .gitignore .


Tip @AkiraYamamoto topi untuk menunjuk ke arah yang benar.

18
04 апр. jawabannya diberikan Chen_Wayne 04 April. 2016-04-04 07:09 '16 pada 7:09 2016-04-04 07:09

Saya pikir, mungkin, git tidak dapat sepenuhnya melupakan file karena konsepnya ( bagian "Gambar, bukan Perbedaan" ).

Masalah ini tidak ada, misalnya, saat menggunakan CVS. CVS menyimpan informasi sebagai daftar perubahan berbasis file. Informasi untuk CVS adalah kumpulan file dan perubahan yang dibuat untuk setiap file dari waktu ke waktu.

Tetapi di git, setiap kali Anda berkomitmen atau menyimpan keadaan proyek Anda, pada dasarnya ia mengambil gambar seperti apa semua file Anda saat ini dan menyimpan tautan ke snapshot ini. Jadi, jika Anda menambahkan file sekali, selalu akan hadir dalam cuplikan ini.

2 artikel ini sangat membantu saya:

git menganggap-tidak ada perubahan vs lewati-worktree dan Cara mengabaikan perubahan dalam file yang dilacak menggunakan git

Berdasarkan ini, saya melakukan hal berikut jika file sudah dilacak:

 git update-index --skip-worktree <file> 

Mulai saat ini, semua perubahan lokal dalam file ini akan diabaikan dan tidak akan dihapus. Jika file diubah ke yang jauh, konflik akan terjadi ketika git pull . Berhenti tidak akan berhasil. Untuk mengatasi masalah, salin konten file ke tempat yang aman dan ikuti >

 git update-index --no-skip-worktree <file> git stash git pull 

Isi file akan digantikan oleh konten yang dihapus. Tempel perubahan Anda dari tempat yang aman ke file dan jalankan lagi:

 git update-index --skip-worktree <file> 

Jika semua orang yang bekerja dengan proyek menjalankan git update-index --skip-worktree <file> , seharusnya tidak ada masalah dengan pull . Solusi ini cocok untuk file konfigurasi ketika setiap pengembang memiliki konfigurasi proyek sendiri.

Ini tidak mudah dilakukan setiap kali file diubah pada komputer jarak jauh, tetapi itu dapat melindunginya dari ditimpa oleh konten jarak jauh.

12
21 мая '17 в 18:12 2017-05-21 18:12 jawabannya diberikan Boolean_Type 21 Mei '17 pukul 6:12 2017-05-05 18:12

Salin / Tempel Respons: git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status

Perintah ini akan mengabaikan file yang sudah ditransfer ke repositori Git, tetapi sekarang kami telah menambahkannya ke .gitignore .

5
19 нояб. Jawabannya diberikan oleh youhans 19 November 2018-11-19 14:21 '18 pukul 14:21 2018-11-19 14:21

Jawaban dari Matt Fear adalah IMHO paling efektif. Berikut ini hanyalah skrip PowerShell untuk mereka yang, pada Windows saja, menghapus file dari repositori git mereka, yang sesuai dengan daftar pengecualian mereka.

 # Get files matching exclusionsfrom .gitignore # Excluding comments and empty lines $ignoreFiles = gc .gitignore | ?{$_ -notmatch "#"} | ?{$_ -match "\S"} | % { $ignore = "*" + $_ + "*" (gci -r -i $ignore).FullName } $ignoreFiles = $ignoreFiles| ?{$_ -match "\S"} # Remove each of these file from Git $ignoreFiles | % { git rm $_} git add . 
5
25 дек. Jawabannya diberikan oleh Ameer Deen 25 Des. 2013-12-25 03:51 '13 pada 3:51 2013-12-25 03:51

Pindahkan atau salin file ke tempat yang aman agar Anda tidak kehi>

5
13 авг. Balas diberikan oleh Apreche 13 Agustus 2009-08-13 22:27 '09 pada 10:27 2009-08-13 22:27

Lakukan >

1. Hapus file yang ditambahkan secara keliru dari direktori / repositori . Anda dapat menggunakan perintah "rm -r" (untuk linux) atau menghapusnya dengan menjelajahi direktori.

2. Tambahkan file / direktori dalam file gitignore dan simpan.

3. Sekarang hapus dari cache git menggunakan perintah ini (jika ada beberapa direktori, hapus satu per satu, u>

 git rm -r --cached path-to-those-files 

4. Sekarang komit dan tekan , gunakan perintah ini. Ini akan menghapus file-file ini dari remote git dan menyebabkan git berhenti melacak file-file itu.

 git add . git commit -m "removed unnecessary files from git" git push origin 
3
20 сент. Jawabannya diberikan oleh Shamsul Arefin Sajib 20 Sep. 2018-09-20 13:52 '18 pada 13:52 2018-09-20 13:52

BFG dirancang khusus untuk menghapus data yang tidak diinginkan, seperti file besar atau kata sandi dari repositori Git, sehingga ia memiliki flag sederhana yang akan menghapus semua file historis besar (bukan pada saat ini): "-strip-blob-more-than"

 $ java -jar bfg.jar --strip-blobs-bigger-than 100M 

Jika Anda ingin menentukan file dengan nama, Anda juga dapat melakukan ini:

 $ java -jar bfg.jar --delete-files *.mp4 

BFG 10-1000x lebih cepat dari cabang Git filter, dan biasanya jauh lebih mudah digunakan - lihat instruksi untuk penggunaan penuh dan contoh untuk detail lebih lanjut.

Sumber: https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html

3
03 сент. Jawaban diberikan oleh Meir Gerenstadt 03 Sep. 2017-09-03 15:37 '17 pada 3:37 siang 2017-09-03 15:37

Saya menyukai jawaban dari JonBrave, tetapi saya memiliki direktori kerja yang cukup kotor yang memperbaiki -a, itu membuat saya sedikit takut, jadi itulah yang saya lakukan:

git config --global alias.exclude-ignored '! git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached git ls-files -z --ignored --exclude-standard | xargs -0 git stage git stage.gitignore git commit -m "gitignore baru dan hapus file yang diabaikan dari indeks"

kehancuran:

 git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached git ls-files -z --ignored --exclude-standard | xargs -0 git stage git stage .gitignore git commit -m "new gitignore and remove ignored files from index" 
  • hapus file yang diabaikan dari indeks
  • Stage.gitignore dan file yang baru saja Anda hapus.
  • untuk berkomitmen
2
08 авг. jawabannya diberikan oleh Jay Irvine 08 Agustus. 2018-08-08 23:49 '18 jam 11:49 2018-08-08 23:49

Jika Anda tidak ingin menggunakan CLI dan bekerja dengan Windows, solusi yang sangat sederhana adalah dengan menggunakan TortoiseGit , ia memiliki tindakan "Hapus (simpan lokal)" di menu, yang berfungsi dengan baik.

2
15 марта '18 в 14:04 2018-03-15 14:04 Jawabannya diberikan oleh Pedi T. 15 Maret '18 pukul 14:04 2018-03-15 14:04

Ini bukan lagi masalah di git terbaru (v2.17.1 pada saat penulisan).

Di .gitignore mengabaikan file yang dilacak, tetapi dihapus. Anda dapat memverifikasi ini sendiri dengan menjalankan skrip berikut. Ekspresi git status terakhir harus mengatakan "tidak melakukan apa pun".

 # Create empty repo mkdir gitignore-test cd gitignore-test git init # Create a file and commit it echo "hello" > file git add file git commit -m initial # Add the file to gitignore and commit echo "file" > .gitignore git add .gitignore git commit -m gitignore # Remove the file and commit git rm file git commit -m "removed file" # Reintroduce the file and check status. # .gitignore is now respected - status reports "nothing to commit". echo "hello" > file git status 
1
13 июня '18 в 19:21 2018-06-13 19:21 Balasan diberikan oleh Lloyd pada 13 Juni 18 pada 19:21 2018-06-13 19:21

Dalam kasus DS_Store sudah berkomitmen:

 find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch 

Abaikan mereka:

 echo ".DS_Store" >> ~/.gitignore_global echo "._.DS_Store" >> ~/.gitignore_global echo "**/.DS_Store" >> ~/.gitignore_global echo "**/._.DS_Store" >> ~/.gitignore_global git config --global core.excludesfile ~/.gitignore_global 

Akhirnya, perbaiki!

0
23 апр. jawabannya diberikan oleh user7718859 23 April. 2018-04-23 00:14 '18 pada 0:14 2018-04-23 00:14

Di mac:

 $ git --version git version 2.6.4 $ uname -a Darwin MUSRV186016-382 14.5.0 Darwin Kernel Version 14.5.0: Sun Sep 25 22:07:15 PDT 2016; root:xnu-2782.50.9~1/RELEASE_X86_64 x86_64 

1. Hapus file DS_Store dari daftar file yang dilacak oleh git di cabang foo:

 $ for file in $(git ls-tree -r foo --name-only | grep -i DS_Store); do git rm --cached $file; done 

2. Berkomitmen:

 $ git commit -m "Removed .DS_Store files" 

3. Periksa apakah file tidak lagi dilacak.

 $ git ls-tree -r foo --name-only # There should not be anything coming back 

4. Klik untuk menghapusnya dari konsol:

 $ git push 
-5
13 янв. Balas diberikan oleh Raphvanns 13 Jan 2017-01-13 22:53 '17 pada 10:53 2017-01-13 22:53

Pertanyaan lain tentang tag atau Ajukan Pertanyaan