Bagaimana Anda membuat Git mengabaikan file tanpa menggunakan .gitignore?

132

Karena kendala aneh eksternal saya tidak dapat mengubah .gitignorerepositori saya. Apakah ada cara untuk mengabaikan file dan direktori selain memodifikasi .gitignore? Bahkan jika itu adalah solusi global seperti konfigurasi global yang akan diterapkan ke semua repositori saya.

pupeno
sumber

Jawaban:

178

Jangan lupa, menurut gitignore , bahwa ada urutan prioritas dalam berbagai "abaikan sumber pola" yang dipertimbangkan Git:

  • Pola membaca dari baris perintah untuk perintah-perintah yang mendukungnya.
  • Pola membaca dari file .gitignore di direktori yang sama dengan path, atau di direktori induk mana pun, dengan pola di file level yang lebih tinggi (hingga root) ditimpa oleh mereka yang berada di file level bawah ke direktori yang berisi file tersebut.
  • Pola dibaca dari $GIT_DIR/info/exclude.
  • Pola membaca dari file yang ditentukan oleh variabel konfigurasi core.excludesfile.

Dua yang terakhir bisa menjadi solusi untuk masalah Anda tetapi:

  • mereka tidak direplikasi untuk repositori jauh
  • mereka dapat memiliki polanya ditimpa oleh sumber lain

(Lihat juga pertanyaan SO ini )


Dua solusi lain melibatkan memperbarui indeks ( git update-index):

Namun, ketika Anda checkout cabang lain atau ketika Anda git pull, status "abaikan" itu mungkin diatur ulang. Maka pilihan lain:

Perbedaan antara keduanya dijelaskan dalam " Git - Perbedaan Antara ' assume-unchanged' dan ' skip-worktree' ".

VONC
sumber
Anda dapat menggunakan update-index --assume-unchanged@see stackoverflow.com/a/25253144/292408
Elijah Lynn
1
@ElijahLynn yakin. Kamu juga punya update-index --skip-work-tree. Saya telah mengedit jawaban untuk menambahkan beberapa tautan ke jawaban lama saya yang menggambarkan kedua update-indexperintah itu.
VonC
140

Jika Anda dapat memodifikasi, .git/info/excludeAnda dapat menempatkan aturan yang sama di sana. Tetapi file itu hanya dalam repo lokal Anda.

Ólafur Waage
sumber
Kedengarannya seperti ini mungkin taruhan terbaik Anda; mari Anda mengecualikan file dari repositori lokal Anda.
Abizern
1
Bagaimana cara kerjanya dengan submodula? Tidak ada .gitdirektori dalam submodule ...
zakdances
10
@yourfriendzak .gitfolder submodule sebenarnya di parent_repo/.git/modules/submodule_name. Jadi, Anda akan mengeditparent_repo/.git/modules/submodule_name/info/exclude
Kara Brightwell
25

Ada tiga cara untuk memberi tahu GIT file mana yang harus diabaikan:

  • .gitignore file
  • $GIT_DIR/.git/info/exclude
  • File menunjuk melalui core.excludesfilepengaturan

Dua poin terakhir bisa menyelesaikan masalah Anda.

Untuk informasi lebih lanjut, lihat gitignore (5) .

Ferdinand Beyer
sumber
5

Jika Anda hanya ingin memiliki beberapa file lokal di repositori dan lokasi subdirektori fleksibel, Anda dapat memasukkan file Anda tracked_dir1/tracked_dir2/untracked_dir/dan kemudian menambahkan tracked_dir1/tracked_dir2/untracked_dir/.gitignoredengan isi seperti:

*

Yaitu

$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
*
<Ctrl+D>
David Winiecki
sumber
4

Saya telah dalam situasi yang sama, jadi saya menambahkan solusi pilihan saya yang tidak saya lihat disebutkan. Masalahnya git update-index --assume-unchangeddalam hal ini adalah Anda tidak bisa melakukan itu untuk file yang tidak dilacak. Kamu berkata

Saya tidak dapat mengubah .gitignore dari repositori saya.

Saya akan berasumsi apa yang Anda maksud adalah bahwa Anda tidak dapat mendorong perubahan apa pun .gitignoreke asal. Jika itu yang dapat Anda lakukan adalah menambahkan file yang tidak terlacak ke lokal Anda .gitignore, maka lakukan git update-index --assume-unchanged .gitignoreagar perubahan Anda ke .gitignoretidak pernah didorong. Sekarang Anda mengabaikan file (kemungkinan) tidak terlacak, dan tidak mempengaruhi .gitignorefile jarak jauh .

Tony
sumber
3

Abaikan perubahan lokal untuk file yang dilacak: git update-index --assume-unchanged my-file.php

Batalkan perubahan lokal ke file yang dilacak: git update-index --no-assume-unchanged my-file.php

sumber: git help update-index

--[no-]assume-unchanged
           ...
           This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked
           files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to
           modify this file in the index e.g. when merging in a commit; thus, in case the assumed-untracked file is
           changed upstream, you will need to handle the situation manually.
Elijah Lynn
sumber
1

Cara lain:

  • sunting lokal .gitignore
  • kemudian git update-index --assume-unchanged .gitignore
lesu
sumber