Czy istnieje sposób, aby stwierdzić, czy plik jest śledzony, uruchamiając jakieś git
polecenie i sprawdzając kod wyjścia?
Innymi słowy: czy git śledzi plik?
Czy istnieje sposób, aby stwierdzić, czy plik jest śledzony, uruchamiając jakieś git
polecenie i sprawdzając kod wyjścia?
Innymi słowy: czy git śledzi plik?
Odpowiedzi:
próbować:
git ls-files --error-unmatch <file name>
wyjdzie z 1, jeśli plik nie jest śledzony
--error-unmatch
opcję przed nazwą pliku, aby otrzymać błąd. Jakoś ta opcja jest stosowana tylko do nazw plików, które następują po niej.
--
), --error-unmatch
jest traktowana jako kolejna nazwa pliku (nie w indeksie) i nie ma żadnego efektu.
git ls-files | grep <PATTERN>
? przykład:git ls-files | grep Main.h
Jeśli nie chcesz zaśmiecać konsoli komunikatami o błędach, możesz także uruchomić
git ls-files file_name
a następnie sprawdź wynik. Jeśli git nic nie zwraca, plik nie jest śledzony. Jeśli jest śledzone, git zwróci ścieżkę do pliku.
Jest to przydatne, jeśli chcesz połączyć to w skrypcie, na przykład PowerShell:
$gitResult = (git ls-files $_) | out-string
if ($gitResult.length -ne 0)
{
## do stuff with the tracked file
}
file_name
musi być to dokładne dopasowanie (pełna ścieżka + nazwa pliku), ale można go używać z symbolami wieloznacznymi:git ls-files *foo.rb
EDYTOWAĆ
Jeśli potrzebujesz użyć git z bash, istnieje --porcelain
opcja git status
:
--porcelana
Daj wynik w stabilnym, łatwym do przeanalizowania formacie dla skryptów. Obecnie jest to identyczne z wyjściem --short, ale gwarantuje, że nie zmieni się w przyszłości, dzięki czemu jest bezpieczne dla skryptów.
Dane wyjściowe wyglądają tak:
> git status --porcelain
M starthudson.sh
?? bla
Lub jeśli robisz tylko jeden plik na raz:
> git status --porcelain bla
?? bla
ORYGINALNY
zrobić:
git status
Zobaczysz raport informujący, które pliki zostały zaktualizowane, a które nie są śledzone.
Możesz zobaczyć, że bla.sh
jest śledzony i modyfikowany i newbla
nie jest śledzony:
# 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")
git status --porcelain
jest twoim przyjacielem, jeśli chcesz przeanalizować dane wyjściowe według skryptu, spójrz na połączony dokument, który pokazuje kilka innych przydatnych opcji
git status --porcelain error: unknown option
wersją Git: porcelana w wersji 1.6.0 :-)
Spróbuj uruchomić git status
plik. Wypisuje błąd, jeśli nie jest śledzony przez git
PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.
git status trackedfile
, dostaję kod wyjścia 1 (oczekiwany jest 0 użyteczny), ale nie daje mi „błędu:” w danych wyjściowych. Wolę parsować kod wyjścia niż ciąg znaków.
.gitignore
$ git status notthere
:On branch master nothing to commit, working directory clean
Nie znam żadnego polecenia git, które daje „zły” kod wyjścia, ale wydaje się, że łatwym sposobem byłoby użycie polecenia git, które nie daje danych wyjściowych dla pliku, który nie jest śledzony, takiego jak git-log lub git-ls-files. W ten sposób nie musisz tak naprawdę analizować, możesz uruchomić go za pomocą innego prostego narzędzia, takiego jak grep, aby sprawdzić, czy jest jakieś wyjście.
Na przykład,
git-ls-files plik_testowy.c | grep
wyjdzie z kodem zerowym, jeśli plik jest śledzony, ale kodem wyjścia, jeśli plik nie jest śledzony.
Proponuję niestandardowy alias dla ciebie .gitconfig
.
Musisz zrobić:
1) Za pomocą polecenia git:
git config --global alias.check-file <command>
2) Edycja ~/.gitconfig
i dodanie tego wiersza w sekcji aliasów:
[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"
Po uruchomieniu polecenia (1) lub zapisanego pliku (2) w obszarze roboczym możesz go przetestować:
$ git check-file
$ Filename missing
$ git check-file README.md
$ File tracked
$ git check-file foo
$ File not tracked
użycie git log
da informacje o tym. Jeśli plik jest śledzony w git, polecenie wyświetla niektóre wyniki (dzienniki). W przeciwnym razie jest pusty.
Na przykład jeśli plik jest śledzony przez git,
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
....
....
Jeśli plik nie jest śledzony,
root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
root@user-ubuntu:~/project-repo-directory#
Tylko moje dwa centy:
git ls-files | grep -x relative/path
gdzie relative/path
można to łatwo ustalić, naciskając tab
w powłoce autouzupełniania. Dodaj dodatkowy, | wc -l
aby uzyskać wynik 1 lub 0.
grep
opcję --fixed-strings
.