Mengapa Git tidak mengabaikan file yang saya tentukan?

195

Saya menambahkan baris berikut ke .gitignore:

sites/default/settings.php

tetapi ketika saya mengetik git statusitu menunjukkan file sebagai file yang tidak dipentaskan.

Apa masalahnya? Semua pola lainnya bekerja dengan baik.

Nick.h
sumber
Saya memiliki masalah yang sama, kemudian saya menemukan bahwa saya menyimpan file .gitignore saya pada drive yang berbeda: face-palm:
Henry Chan
Merupakan ide yang sangat buruk untuk menyimpan barang-barang di repositori Anda dan mengabaikan perubahan di dalamnya.
Yevgeniy Afanasyev

Jawaban:

370

Pastikan bahwa Anda .gitignoreberada di root direktori kerja, dan dalam direktori tersebut jalankan git statusdan salin path ke file dari output status dan tempel ke .gitignore.

Jika itu tidak berhasil, maka kemungkinan file Anda sudah dilacak oleh Git. Anda dapat mengkonfirmasi ini melalui output dari git status. Jika file tidak terdaftar di bagian "File tidak dilacak " , maka file tersebut sudah dilacak oleh Git dan itu akan mengabaikan aturan dari .gitignorefile tersebut.

Alasan untuk mengabaikan file di Git adalah agar mereka tidak akan ditambahkan ke repositori. Jika sebelumnya Anda menambahkan file yang ingin Anda abaikan, maka file itu akan dilacak oleh Git dan aturan abaikan yang cocok akan dilewati. Git melakukan ini karena file tersebut sudah menjadi bagian dari repositori.

Untuk benar-benar mengabaikan file, Anda harus membuka dan menghapusnya dari repositori. Anda dapat melakukannya dengan menggunakan git rm --cached sites/default/settings.php. Ini menghapus file dari repositori tanpa secara fisik menghapus file (itulah yang --cacheddilakukannya). Setelah melakukan perubahan itu, file tersebut akan dihapus dari repositori, dan mengabaikannya akan berfungsi dengan baik.

menyodok
sumber
Apa yang Anda maksud dengan 'root direktori kerja'? Direktori tempat repositori '.git' ditemukan?
Jonathan Leffler
Direktori yang berfungsi adalah direktori di mana .gitdirektori itu berada dan yang merupakan akar repositori itu sendiri. Seperti ketika Anda mengkloning repositori untuk /xy/kemudian /xy/adalah direktori kerja Anda dengan /xy/.git/di dalamnya.
colek
3
Terkadang Anda juga perlu melakukan git add .setelah git rm --cacheduntuk membangun kembali indeks dengan benar.
Cooper
Gagasan untuk memeriksanya dalam status git sangat brilian. Saya terus memeriksanya di Git Staging in Eclipse dan jalurnya salah. Terima kasih!
walla
1
Saya perlu menambahkan tanda -r (rekursif) karena saya juga memeriksa folder bersarang. Dalam kasus saya, saya pindah ke root folder git saya kemudian menjalankan perintah git rm --cached -r .vs / Where vs adalah folder tingkat atas yang ingin saya hapus dari pelacakan.
Devology Ltd
106

Saya mengalami ini, ini pertanyaan lama, tapi saya ingin file itu dilacak tetapi tidak melacaknya pada copy pekerjaan tertentu, untuk itu Anda dapat menjalankannya

git update-index --assume-unchanged sites/default/settings.php
Mescalito
sumber
5
Itu sebenarnya jawaban yang saya cari. Semua jawaban lain berasumsi bahwa file telah ditambahkan dengan git add, yang tidak selalu demikian. Dengan Acquia Cloud, file .gitignore seharusnya mengabaikan settings.php (misalnya) tetapi file tersebut disertakan dengan komit pertama. Menghapus jejak file, cukup menghapusnya dari repositori, oleh karena itu menghapusnya dari situs langsung ...
PatrickS
Membantu saya juga - terima kasih! Terpilih. Saya menduga meskipun itu hanya berlaku untuk repo git lokal dan tidak akan bertahan setelah didorong ke jarak jauh dan diklon oleh devs lain?
Ivan
1
Ya, itu hanya lokal.
Mescalito
41

.gitignore hanya akan mengabaikan file yang belum Anda tambahkan ke repositori Anda.

Jika Anda melakukan git add ., dan file ditambahkan ke indeks, .gitignore tidak akan membantu Anda. Anda harus melakukannya git rm sites/default/settings.phpuntuk menghapusnya, dan kemudian itu akan diabaikan.

jonescb
sumber
terima kasih. tetapi bagaimana cara menghapus file hanya dari indeks dan bukan dari direktori kerja?
Nick.h
1
git rmharus melakukan itu, tetapi mungkin meminta Anda untuk menggunakan opsi -f yang akan menghapusnya dari direktori kerja. Saya belum menemukan ini selain untuk membuat salinan file, lakukan git rm -fdan kemudian kembalikan salinannya.
jonescb
Sama, bung. Buat salinan di suatu tempat, hapus, komit status dihapus, tambahkan kembali file dan lihat bagaimana mereka diabaikan sekarang.
Yevgeniy Afanasyev
18

Silakan gunakan perintah ini

git rm -rf --cached .
git add .

Terkadang file .gitignore tidak berfungsi meskipun benar. Alasan Git mengabaikan file adalah karena mereka tidak ditambahkan ke repositori. Jika Anda menambahkan file yang ingin Anda abaikan sebelumnya, itu akan dilacak oleh Git, dan aturan apa pun yang akan dilompati akan dilewati. Git melakukan ini karena file tersebut sudah menjadi bagian dari repositori.

LiQiang
sumber
12

Saya memiliki masalah yang sama. File didefinisikan di .gitingoremana terdaftar sebagai file yang tidak dilacak saat dijalankan git status.

Alasannya adalah bahwa .gitignorefile tersebut disimpan dalam UTF-16LEpenyandian, dan bukan dalam UTF8penyandian.

Setelah mengubah penyandian .gitignorefile UTF8itu berfungsi untuk saya.

Floris Devreese
sumber
Saya merasa seperti noob karena ini ... dang it Windows
Coty Embry
Adakah yang tahu mengapa pengodean file penting? Mungkin tidak membaca jalur dengan benar?
Chargnn
2

Apa yang saya lakukan untuk mengabaikan file settings.php berhasil:

  1. git rm --cached sites / default / settings.php
  2. komit (hingga di sini tidak berhasil)
  3. situs yang dihapus secara manual / default / settings.php (ini berhasil)
  4. git add.
  5. komit (berhasil diabaikan)

Saya pikir jika ada file yang berkomitmen pada Git maka abaikan tidak berfungsi seperti yang diharapkan. Hapus saja file dan komit. Setelah itu akan diabaikan.

Alper Ebicoglu
sumber
2

Ada beberapa contoh, misalnya file Konfigurasi Aplikasi, yang ingin saya lacak di git (jadi .gitignore tidak akan berfungsi), tetapi saya perlu mengubah pengaturan lokal. Saya tidak ingin git mengelola file-file ini atau menunjukkannya sebagai modifikasi. Untuk melakukan ini saya menggunakan skip-worktree:

git update-index --skip-worktree path/to/file

Anda dapat mengonfirmasi file yang dilewati dengan mendaftar file dan memeriksa baris yang dimulai dengan S untuk dilewati

git ls-files -v | grep ^S

Jika di masa depan Anda ingin git mengelola file secara lokal lagi cukup jalankan:

 git update-index --no-skip-worktree path/to/file

Mescalito di atas memiliki jawaban yang bagus, tetapi itu membawa saya ke jalur yang benar

git update-index --assume-unchanged file / to / diabaikan.php

Memiliki kontrak dengan git di mana: pengguna berjanji untuk tidak mengubah file dan memungkinkan Git untuk berasumsi bahwa file tree kerja sesuai dengan apa yang dicatat dalam indeks.

Namun, saya mengubah konten file, jadi dalam kasus saya --skip-worktree adalah pilihan yang lebih baik.

Situs web Toshiharu Nishina memberikan penjelasan yang sangat baik tentang skip-worktree vs asumsi-tidak berubah: Abaikan file yang sudah dikelola dengan Git secara lokal

J.Leupp
sumber
2

Alasan lain yang mungkin - beberapa contoh klien git berjalan pada saat yang sama . Misalnya "git shell" + "GitHub Desktop", dll.


Ini terjadi pada saya, saya menggunakan "GitHub Desktop" sebagai klien utama dan mengabaikan beberapa pengaturan .gitignore baru: komit setelah komit:

  1. Anda melakukan sesuatu.
  2. Selanjutnya, komit: mengabaikan pengaturan .gitignore. Commit menyertakan banyak file temp yang disebutkan dalam .gitignore.
  3. Hapus cache git; periksa apakah .gitignore adalah UTF8; hapus file -> komit -> pindahkan file kembali; lewati 1 commit - tidak ada yang membantu.

Alasan : editor Visual Studio Code sedang berjalan di latar belakang dengan repositori terbuka yang sama. VS Code memiliki kontrol git bawaan, dan ini membuat beberapa konflik.

Solusi : periksa ulang beberapa klien git tersembunyi dan gunakan hanya satu klien git sekaligus, terutama saat membersihkan cache git.

Oleg Zarevennyi
sumber
1

Pastikan .gitignore tidak memiliki ekstensi !! Tidak boleh .gitignore.txt, di windows cukup beri nama file .gitignore. dan itu akan berhasil.

ZackOfAllTrades
sumber
0

Saya baru saja mencoba ini dengan git 1.7.3.1, dan diberi struktur seperti:

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

di mana repodengan demikian adalah "root" yang disebutkan di atas (saya akan menyebutnya root dari pohon kerja Anda), dan .gitignorehanya berisi sites/default/settings.php, abaikan bekerja untuk saya (dan tidak masalah apakah .gitignoreditambahkan ke repo atau tidak). Apakah ini cocok dengan tata letak repo Anda? Jika tidak, apa yang berbeda?

Johan
sumber
Yes.it persis sama dengan yours.but tidak berfungsi. Semua pola lain berfungsi. Seperti yang saya katakan masalah pasti relatif terhadap folder settings.php.
Nick.h
Saya merasa itu ide yang sangat buruk untuk menyimpan barang-barang di repositori Anda dan mengabaikan perubahan di dalamnya.
Yevgeniy Afanasyev
@YevgeniyAfanasyev kecuali untuk hal-hal seperti keluaran kompilasi, pengaturan pengguna IDE, semua file temp lainnya yang dihasilkan oleh toolchain Anda ...
Chris F Carroll
Maksud saya menjaga komitmen dalam repositori, bukan hanya file yang duduk di folder proyek. Mengapa Anda perlu file temp di repositori?
Yevgeniy Afanasyev
0

Kalau-kalau ada orang di masa depan yang memiliki masalah yang sama dengan saya:

Jika Anda menggunakan

*
!/**/
!*.*

trik untuk menghapus file biner tanpa ekstensi, pastikan SEMUA garis gitignore lainnya DI BAWAH. Git akan membaca dari .gitignore dari atas, jadi meskipun saya memiliki 'test.go' di gitignore saya, itu pertama kali dalam file, dan menjadi 'tidak ditandai' setelah

!*.*
Alasdair Mclean
sumber
0

Saya mencoba sebagian besar perintah di atas pada terminal VS Code dan saya mendapat kesalahan seperti:

fatal: pathspec '[dir]/[file]' did not match any files

Saya membuka proyek di GitHub Desktop dan mengabaikannya dan berhasil.

Danna Capellan
sumber