Bagaimana cara mengetahui apakah suatu file git dilacak (dengan kode keluar shell)?

357

Apakah ada cara untuk mengetahui apakah suatu file sedang dilacak dengan menjalankan beberapa gitperintah dan memeriksa kode keluarnya?

Dengan kata lain: apakah git melacak file?

Dale Forester
sumber
Saya pikir intinya adalah, apa kriteria untuk memutuskan file sebagai terlacak atau tidak terlacak. Seharusnya ada semacam koleksi file yang dilacak untuk dicari.
smwikipedia

Jawaban:

443

mencoba:

git ls-files --error-unmatch <file name>

akan keluar dengan 1 jika file tidak dilacak

Hasen
sumber
Setidaknya dengan versi git saya yang lebih lama (1.6.0), Anda harus meletakkan --error-unmatchopsi sebelum nama file untuk mendapatkan kesalahan. Entah bagaimana opsi ini hanya diterapkan pada nama file yang mengikutinya.
Alex Dupuy
Sebenarnya, masalahnya adalah GNU getopt permuting tidak diaktifkan, dan ketika muncul setelah nama file (atau setelah --), --error-unmatchdiperlakukan sebagai nama file (bukan dalam indeks), dan tidak berpengaruh.
Alex Dupuy
29
git ls-files | grep <PATTERN>? contoh:git ls-files | grep Main.h
gaussblurinc
1
[Cara naif] Buat perubahan kecil pada file (tambah / hapus spasi). Dan lihat apakah file tersebut terdaftar ketika 'git status' diketik. Cara yang konyol, tetapi dapat menghemat waktu.
BraveNinja
Tetapi saya menambahkan dan mengkomitnya dengan perintah "git add -A && git commit -m" bla. Bahkan melihat seluruh file dengan perintah "git ls-tree --name-only -r sha1".
Dr.jacky
66

Jika Anda tidak ingin mengacaukan konsol Anda dengan pesan kesalahan, Anda juga dapat menjalankannya

git ls-files file_name

dan kemudian periksa hasilnya. Jika git tidak mengembalikan apa-apa, maka file tidak dilacak. Jika dilacak, git akan mengembalikan path file.

Ini sangat berguna jika Anda ingin menggabungkannya dalam skrip, misalnya PowerShell:

$gitResult = (git ls-files $_) | out-string
if ($gitResult.length -ne 0)
{
    ## do stuff with the tracked file
}
cheesus
sumber
Saya pikir file_nameperlu pertandingan yang tepat (path lengkap + nama file), tetapi dapat digunakan dengan wildcard:git ls-files *foo.rb
dechimp
16

EDIT

Jika Anda perlu menggunakan git dari bash ada --porcelainopsi untuk git status:

--porselen

Berikan hasil dalam format skrip yang stabil dan mudah diurai. Saat ini identik dengan output - pendek, tetapi dijamin tidak akan berubah di masa depan, sehingga aman untuk skrip.

Output terlihat seperti ini:

> git status --porcelain
 M starthudson.sh
?? bla

Atau jika Anda hanya melakukan satu file pada satu waktu:

> git status --porcelain bla
?? bla

ASLI

melakukan:

git status

Anda akan melihat laporan yang menyatakan file mana yang diperbarui dan mana yang tidak dilacak.

Anda dapat melihat bla.shdilacak dan dimodifikasi dan newblatidak dilacak:

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#
#       modified:   bla.sh
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       newbla
no changes added to commit (use "git add" and/or "git commit -a")
Stefan
sumber
Maaf saya seharusnya lebih jelas. Statusnya oke tapi saya lebih suka memeriksa kode keluar dari parse output.
Dale Forester
git status --porcelainadalah teman Anda jika Anda perlu mengurai output dengan skrip, lihat dokumen yang tertaut itu menunjukkan beberapa opsi lain yang berguna
stefanB
Hihi, tidak bekerja dengan Git yang sangat lama: git status --porcelain error: unknown option Versi porselen adalah 1.6.0 :-)
Laryx Decidua
@ user465139 itu benar ... Anda perlu git 1.7.0 atau yang lebih baru (opsi porselen tidak ditambahkan sampai saat itu).
mason81
13

Coba jalankan git statuspada file. Ini akan mencetak kesalahan jika tidak dilacak oleh git

PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.
JaredPar
sumber
Wow. Saya pasti menjalankannya di direktori dan bertindak seperti sedang memeriksa seluruh repo. Terima kasih.
Dale Forester
4
Sebenarnya, jika saya menjalankan git status trackedfilesaya mendapatkan kode keluar 1 (diharapkan 0 berguna) tetapi tidak memberi saya "error:" di output. Saya lebih suka mengurai kode keluar dari output string.
Dale Forester
43
Saya menemukan bahwa tidak ada kesalahan yang muncul jika saya menjalankan status git pada file yang ada dalam copy pekerjaan git saya tetapi yang dikecualikan oleh .gitignore. (Yaitu jawaban ini tidak akan berhasil.)
JellicleCat
Harap dicatat bahwa itu tidak berfungsi dengan baik jika file tersebut ada dalam daftar abaikan, yaitu dalam file.gitignore
Robin Hsu
8
Itu tidak berhasil. Itu selalu mencetak hal yang sama, bahkan jika file tersebut tidak ada. $ git status notthere:On branch master nothing to commit, working directory clean
Chloe
6

Saya tidak tahu ada perintah git yang memberikan kode keluar "buruk", tetapi sepertinya cara mudah untuk melakukannya adalah dengan menggunakan perintah git yang tidak menghasilkan keluaran untuk file yang tidak dilacak, seperti git-log atau git-ls-files. Dengan begitu Anda tidak perlu melakukan parsing apa pun, Anda dapat menjalankannya melalui utilitas sederhana lain seperti grep untuk melihat apakah ada output.

Sebagai contoh,

git-ls-files test_file.c | grep.

akan keluar dengan kode nol jika file dilacak, tetapi kode keluar satu jika file tidak dilacak.

Jay Walker
sumber
3

Saya menyarankan alias khusus pada Anda .gitconfig.

Anda harus melakukannya:

1) Dengan perintah git:

git config --global alias.check-file <command>

2) Mengedit ~/.gitconfigdan menambahkan baris ini pada bagian alias:

[alias]
    check-file = "!f() { if [ $# -eq 0 ]; then echo 'Filename missing!'; else tracked=$(git ls-files ${1}); if [[ -z ${tracked} ]]; then echo 'File not tracked'; else echo 'File tracked'; fi; fi;  };  f"

Setelah meluncurkan perintah (1) atau file yang disimpan (2), di ruang kerja Anda, Anda dapat mengujinya:

$ git check-file
$ Filename missing 

$ git check-file README.md
$ File tracked 

$ git check-file foo
$ File not tracked
Luca Davanzo
sumber
2

menggunakan git logakan memberikan info tentang ini. Jika file dilacak di git, perintah menunjukkan beberapa hasil (log). Selain itu kosong.

Sebagai contoh jika file git dilacak,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
commit ad9180b772d5c64dcd79a6cbb9487bd2ef08cbfc
Author: User <[email protected]>
Date:   Mon Feb 20 07:45:04 2017 -0600

    fix eslint indentation errors
....
....

Jika file tidak git dilacak,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
root@user-ubuntu:~/project-repo-directory#
SuperNova
sumber
1

Hanya dua sen saya:

git ls-files | grep -x relative/path

di mana relative/pathdapat dengan mudah ditentukan dengan menekan di tabdalam shell pelengkapan otomatis. Tambahkan tambahan | wc -l untuk mendapatkan hasil 1 atau 0.

andreee
sumber
Bergantung pada path (mis. Jika mengandung titik), Anda harus menambahkan grepopsi --fixed-strings.
EndlosSchleife