Jelaskan aturan gitignore mana yang mengabaikan file saya

310

Apakah ada cara untuk melihat mengapa beberapa file diabaikan oleh git (yaitu aturan mana dalam .gitignorefile yang menyebabkan file tersebut diabaikan)?

Bayangkan saya punya ini (atau skenario yang jauh lebih kompleks, dengan ratusan folder dan puluhan .gitignorefile:

/
-.gitignore
-folder/
    -.gitignore
    -subfolder/
              -.gitignore
              -file.txt

Jika saya menjalankan git add folder/subfolder/file.txtgit, mungkin dikeluhkan karena diabaikan:

The following paths are ignored by one of your .gitignore files:
folder/subfolder/file.txt
Use -f if you really want to add them.

Apakah ada cara untuk mengetahui yang mana dari semua yang mungkin .gitignorememiliki aturan untuk mengabaikan file ini, dan juga menunjukkan aturannya? Suka:

The following paths are ignored by your folder/.gitignore file (line 12: *.txt)
folder/subfolder/file.txt
Use -f if you really want to add them.

Atau hanya:

$ git why-is-ignored folder/subfolder/file.txt
folder/.gitignore:12:*.txt
Carlos Campderrós
sumber
4
Catatan: git check-ignoreakan segera (git1.8.5 / 1.9) memiliki --no-indexopsi. Lihat jawaban saya di bawah ini
VonC
Catatan: GIT_TRACE_EXCLUDE=1 git statusakan segera menjadi cara tambahan untuk men-debug .gitignoreaturan. Lihat jawaban saya yang diedit di bawah ini
VonC
Posting blog yang relevan: danielcompton.net/2016/04/21/… .
krlmlr

Jawaban:

643
git check-ignore -v filename

Lihat halaman manual untuk lebih jelasnya.

Jawaban asli berikut:

git saat ini tidak menyediakan yang seperti ini. Tetapi setelah melihat pertanyaan Anda, saya melakukan beberapa pencarian di Google dan menemukan bahwa pada tahun 2009 fitur ini diminta dan diterapkan sebagian . Setelah membaca utas, saya menyadari itu tidak akan terlalu banyak pekerjaan untuk melakukannya dengan benar, jadi saya sudah mulai mengerjakan tambalan dan berharap untuk menyelesaikannya pada satu atau dua hari berikutnya. Saya akan memperbarui jawaban ini ketika sudah siap.

UPDATE: Wow, itu jauh lebih sulit daripada yang saya harapkan. Jeroan dari gitpenanganan yang dikecualikan cukup samar. Anyway, inilah sebuah hampir seri selesai komit yang berlaku untuk hulu saat ini mastercabang. Test suite selesai 99%, tapi saya belum selesai menangani --stdinopsi ini. Semoga saya akan mengaturnya akhir pekan ini, dan kemudian mengirimkan tambalan saya ke milis git.

Sementara itu, saya pasti akan menerima pengujian dari siapa saja yang dapat melakukannya - cukup tiruan dari garpu sayagit , periksa check-ignorecabang, dan kompilasi seperti biasa.

UPDATE 2: Sudah selesai! Versi terbaru ada di github seperti di atas, dan saya telah mengirimkan seri tambalan ke milis git untuk ditinjau oleh rekan sejawat. Mari kita lihat apa yang mereka pikirkan ...

UPDATE 3: Setelah beberapa bulan peretasan / tambalan ulasan / diskusi / menunggu, saya senang dapat mengatakan bahwa fitur ini sekarang telah mencapai mastercabang git , dan akan tersedia di rilis berikutnya (1.8.2, diharapkan ke-8 Maret 2013). Ini check-ignorehalaman manual . Fiuh, itu jauh lebih banyak pekerjaan daripada yang saya harapkan!

UPDATE 4: Jika Anda tertarik dengan cerita lengkap tentang bagaimana jawaban ini berkembang dan fitur datang untuk diimplementasikan, lihat episode # 32 dari podcast GitMinutes .

Adam Spires
sumber
2
Saya menggunakan 1.8.2 dan git check-ignoretidak melakukan apa-apa.
zakdances
3
@yourfriendzak Tanpa keraguan, git check-ignorehadir dan bekerja di 1.8.2. Jika tingkah lakunya tidak seperti yang Anda harapkan, saya sarankan Anda (kembali) membaca halaman buku panduan, dan jika masih belum, silakan kirimkan laporan bug yang tepat pada milis git. Hanya mengatakan itu tidak melakukan apa pun tidak sangat membantu. Saya berharap Anda memiliki mungkin menjalankannya pada non-diabaikan berkas dan tidak benar mengharapkan beberapa output (meskipun saya mungkin akan menambahkan dukungan untuk --show-unmatchedke --verbosemode keluaran di masa depan).
Adam Spires
1
@AdamSpires Anda benar. Saya seharusnya menentukan bahwa ketika saya menjalankan perintah, tidak ada yang dicetak. Tidak ada pesan kesalahan, tidak ada pesan sukses, tidak ada info. Selanjutnya, prompt kosong muncul. Jadi, apakah saya benar berasumsi bahwa "tidak ada output" adalah perilaku yang diharapkan dalam keadaan tertentu?
zakdances
1
@AdamSpiers terima kasih banyak atas ini! Setelah 3 hari penyelidikan, Anda baru saja membantu saya melacak penyebab bangunan rusak karena file yang diabaikan secara global di .gitignore_global! Aku bahkan tidak tahu itu hal!
BenBtg
3
Tidak setiap hari orang melihat pengembang Stack Overflow membuat begitu banyak perubahan untuk mengimplementasikan fitur pengembang. Wow dan hormat.
user3613932
18

Perbarui git 2.8 (Maret 2016):

GIT_TRACE_EXCLUDE=1 git status

Lihat " Cara memvalidasi .gitignorefile "

Itu saling melengkapi dengan yang git check-ignore -vdijelaskan di bawah ini.


Jawaban asli: September 2013 (git 1.8.2, lalu 1.8.5+):

git check-ignoremeningkat lagi di git 1.8.5 / 1.9 (Q4 2013) :

" git check-ignore" mengikuti aturan yang sama dengan " git add" dan " git status" di mana mekanisme abaikan / kecualikan tidak berpengaruh pada jalur yang sudah dilacak.
Dengan --no-indexopsi " ", ini dapat digunakan untuk mendiagnosis jalur mana yang seharusnya diabaikan yang secara keliru ditambahkan ke indeks .

Lihat komit 8231fa6 dari https://github.com/flashydave :

check-ignoresaat ini menunjukkan bagaimana .gitignoreaturan akan memperlakukan jalur yang tidak dilacak. Jalur yang dilacak tidak menghasilkan keluaran yang bermanfaat.
Ini mencegah debug mengapa jalur menjadi dilacak secara tak terduga kecuali jika jalur itu pertama kali dihapus dari indeks dengan git rm --cached <path>.

Opsi --no-indexmemberi tahu perintah untuk memintas pemeriksaan untuk jalur yang ada dalam indeks dan karenanya memungkinkan jalur terlacak untuk diperiksa juga.

Sementara perilaku ini menyimpang dari karakteristik git adddan git statuskasus penggunaannya tidak mungkin menyebabkan kebingungan pengguna.

Skrip uji ditambah untuk memeriksa opsi ini terhadap standar abaikan untuk memastikan perilaku yang benar.


--no-index::

Jangan melihat indeks ketika melakukan cek.
Ini dapat digunakan:

  • untuk men-debug mengapa suatu jalur dilacak oleh misalnya git add .dan tidak diabaikan oleh aturan seperti yang diharapkan oleh pengguna atau
  • ketika mengembangkan pola termasuk negasi untuk mencocokkan jalan yang sebelumnya ditambahkan dengan git add -f.
VONC
sumber
4

Saya tidak dapat menemukan apa pun di halaman manual tetapi di sini adalah skrip cepat dan kotor yang akan memeriksa file Anda di setiap direktori induk untuk melihat apakah itu bisa ditambahkan git. Jalankan di direktori yang berisi file masalah sebagai:

test-add.sh STOP_DIR FILENAME

di mana STOP_DIRdirektori tingkat atas dari proyek Git dan FILENAMEmerupakan nama file masalah (tanpa jalur). Itu membuat file kosong dengan nama yang sama di setiap tingkat hirarki (jika tidak ada) dan mencoba git add -nuntuk melihat apakah itu dapat ditambahkan (itu membersihkan sendiri). Ini menghasilkan sesuatu seperti:

FAILED:    /dir/1/2/3
SUCCEEDED: /dir/1/2

Naskah:

#!/usr/bin/env bash
TOP=$1
FILE=$2
DIR=`pwd`
while : ; do
  TMPFILE=1
  F=$DIR/$FILE
  if [ ! -f $F ]; then
    touch $F
    TMPFILE=0
  fi
  git add -n $F >/dev/null 2>&1
  if [ $? = 0 ]; then
    echo "SUCCEEDED: $DIR"
  else
    echo "FAILED:    $DIR"
  fi
  if [ $TMPFILE = 0 ]; then
    rm $F
  fi
  DIR=${DIR%/*}
  if [ "$DIR" \< "$TOP" ]; then
    break
  fi
done 
edoloughlin
sumber
1

Untuk menambah jawaban utama menggunakan git check-ignore -v filename(terima kasih BTW) saya menemukan bahwa file .gitignore saya memblokir semuanya karena ada baris baru setelah wildcard, jadi saya punya:

* .sublime-project

sebagai contoh. Saya baru saja menghapus baris baru, dan voila! Itu diperbaiki.

rekordboy
sumber