Bir dosyanın git'in izlenip izlenmediğini nasıl anlarsınız (kabuk çıkış koduna göre)?


358

Bazı gitkomutları çalıştırarak ve çıkış kodunu kontrol ederek bir dosyanın izlenip izlenmediğini anlamanın bir yolu var mı ?

Başka bir deyişle: git bir dosyayı mı izliyor?


Bence, izlenen veya izlenmeyen bir dosyaya karar verme kriterleri nedir? Aranacak bir tür izlenen dosya koleksiyonu olmalıdır.
smwikipedia

Yanıtlar:


445

Deneyin:

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

dosya izlenmezse 1 ile çıkar


En azından benim git (1.6.0) sürümü ile, bir hata almak için --error-unmatchseçeneği dosya adının önüne koymanız gerekir . Her nasılsa, seçenek yalnızca onu izleyen dosya adlarına uygulanır.
Alex Dupuy

Aslında sorun, GNU getopt seçeneğine izin verilmesinin etkin olmadığı ve bir dosya adından (veya sonrasından --) sonra görününce, başka bir dosya adı ( --error-unmatchdizin içinde değil) olarak ele alındığı ve hiçbir etkisi olmadığı gibi görünüyor.
Alex Dupuy

29
git ls-files | grep <PATTERN>? örnek:git ls-files | grep Main.h
gaussblurinc

1
[Saf bir yol] Dosyada küçük bir değişiklik yapın (boşluk ekleyin / kaldırın). Ve 'git status' yazıldığında dosyanın listelenip listelenmediğine bakın. Aptalca bir yol, ama zamandan tasarruf edebilir.
BraveNinja

Ama ekledim ve "git add -A && git commit -m" blah "komutuyla tamamladım. Tüm dosyaları" git ls-tree - only -r -r sha1 "komutuyla bile görebilirim.
Dr.jacky

66

Konsolunuzu hata iletileriyle karıştırmak istemiyorsanız,

git ls-files file_name

ve ardından sonucu kontrol edin. Git hiçbir şey döndürmezse, dosya izlenmez. İzlenirse, git dosya yolunu döndürür.

Bir komut dosyasında birleştirmek istiyorsanız bu kullanışlı olur, örneğin PowerShell:

$gitResult = (git ls-files $_) | out-string
if ($gitResult.length -ne 0)
{
    ## do stuff with the tracked file
}

Bence file_nametam bir eşleşme olması gerekiyor (tam yol + dosya adı), ancak joker karakterlerle kullanılabilir:git ls-files *foo.rb
dechimp

16

DÜZENLE

Eğer bash kullanımı Git gerekiyorsa orada --porcelainseçeneği git status:

--porselen

Çıktıya komut dosyaları için sabit, ayrıştırılması kolay bir format verin. Şu anda bu --kısa çıktı ile aynıdır, ancak gelecekte değişmeyeceği garanti edilir ve komut dosyaları için güvenli hale gelir.

Çıktı şöyle görünür:

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

Veya aynı anda yalnızca bir dosya yaparsanız:

> git status --porcelain bla
?? bla

ORİJİNAL

yapmak:

git status

Hangi dosyaların güncellendiğini ve hangilerinin izlenmediğini belirten bir rapor göreceksiniz.

Sen görebilirsiniz bla.shizlenen ve modifiye ve newblaizlenmez:

# 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")

Üzgünüm daha net olmalıydım. Durum iyi ama çıktı ayrıştırmak yerine bir çıkış kodu kontrol etmek istiyorum.
Dale Forester

git status --porcelainçıktıyı komut dosyasıyla ayrıştırmanız gerekiyorsa, bağlantılı dokümana bir göz atın, diğer bazı yararlı seçenekleri gösterin
stefanB

Hihi, çok eski Git ile çalışmaz: git status --porcelain error: unknown option porcelain 'Versiyon 1.6.0 :-)
Laryx Decidua

@ user465139 doğru ... git 1.7.0 veya daha yenisine ihtiyacınız var (o zamana kadar porselen seçeneği eklenmedi).
mason81

13

git statusDosya üzerinde çalışmayı deneyin . Git tarafından izlenmezse bir hata yazdırır

PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.

Vay. Bir dizinde çalıştırıyor olmalıyım ve tüm repoyu kontrol ediyormuş gibi davranıyordu. Teşekkürler.
Dale Forester

4
Aslında, ben çalıştırırsanız git status trackedfileçıkış kodu 1 (0 yararlı olması bekleniyor) olsun ama çıktı "bana hata:" vermez. Dize çıktısı yerine bir çıkış kodu ayrıştırmak istiyorum.
Dale Forester

43
Git çalışma kopyamda bulunan ancak .gitignore tarafından dışlanan bir dosyada git durumunu çalıştırırsam hiçbir hata oluşmadığını görüyorum. (Yani bu cevap olmaz.)
JellicleCat

Dosya yoksay listesinde, yani dosyada ise iyi çalışmadığını lütfen unutmayın.gitignore
Robin Hsu

8
Bu işe yaramıyor. Dosya olmasa bile her zaman aynı şeyi yazdırır. $ git status notthere:On branch master nothing to commit, working directory clean
Chloe

6

"Kötü" bir çıkış kodu veren herhangi bir git komutunu bilmiyorum, ama bunu yapmak için kolay bir yol gibi görünüyor izlenmeyen bir dosya için hiçbir çıkış veren bir git komutu kullanmak gibi görünüyor git-log veya git-ls-files. Bu şekilde gerçekten ayrıştırma yapmak zorunda kalmazsınız, herhangi bir çıktı olup olmadığını görmek için grep gibi başka bir basit yardımcı program üzerinden çalıştırabilirsiniz.

Örneğin,

git-ls-dosyaları test_file.c | grep.

dosya izlenirse sıfır koduyla, dosya izlenmezse çıkış koduyla çıkar.


3

Özel bir önermek takma sana .gitconfig.

Yapmanız gereken yol:

1) git komutu ile:

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

2) ~/.gitconfigBu satırı diğer ad bölümünde düzenleyin ve ekleyin:

[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"

Komut (1) veya kaydedilmiş dosya (2) başlatıldıktan sonra, çalışma alanınızda test edebilirsiniz:

$ git check-file
$ Filename missing 

$ git check-file README.md
$ File tracked 

$ git check-file foo
$ File not tracked

2

kullanarak git logbu konuda bilgi verecektir. Dosya git'te izlenirse, komut bazı sonuçlar (günlükler) gösterir. Yoksa boş.

Örneğin, dosya git izlenirse,

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

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

Dosya git izinde değilse,

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

1

Sadece iki sentim:

git ls-files | grep -x relative/path

burada relative/pathkolaylıkla basarak belirlenebilir tabbir otomatik tamamlama kabuk içinde. | wc -l 1 veya 0 çıkış almak için bir ek ekleyin .


Yola bağlı olarak (örneğin, bir nokta içeriyorsa), grepseçenek eklemeniz gerekir --fixed-strings.
EndlosSchleife
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.