Как определить, отслеживается ли файл git (по коду выхода из оболочки)?

357

Есть ли способ узнать, отслеживается ли файл, выполнив какую-либо gitкоманду и проверив код ее выхода?

Другими словами: git отслеживает файл?

Дейл Форестер
источник
Я думаю, дело в том, каковы критерии для определения файла как отслеженного или не отслеженного. Там должен быть какой-то отслеживаемый набор файлов для поиска.
smwikipedia

Ответы:

444

пытаться:

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

выйдет с 1, если файл не отслежен

Hasen
источник
По крайней мере, в моей более старой (1.6.0) версии git вам нужно поставить --error-unmatchопцию перед именем файла, чтобы получить ошибку. Каким-то образом опция применяется только к именам файлов, которые следуют за ней.
Алекс Дюпюи
На самом деле проблема заключается в том, что перестановка опций GNU getopt не включена, и при появлении после имени файла (или после --) --error-unmatchон обрабатывается как просто другое (не в индексе) имя файла и не имеет никакого эффекта.
Алекс Дюпуй
29
git ls-files | grep <PATTERN>? пример:git ls-files | grep Main.h
gaussblurinc
1
[Наивный способ] Внесите небольшое изменение в файл (добавьте / удалите пробел). И посмотрите, есть ли файл в списке при наборе 'git status'. Глупый путь, но может сэкономить время.
BraveNinja
Но я добавил и зафиксировал его с помощью команды "git add -A && git commit -m" blah ". Даже файлы целиком вижу с помощью команды" git ls-tree --name-only -r sha1 ".
Dr.jacky
66

Если вы не хотите загромождать консоль сообщениями об ошибках, вы также можете запустить

git ls-files file_name

а затем проверьте результат. Если git ничего не возвращает, файл не отслеживается. Если он отслеживается, git вернет путь к файлу.

Это удобно, если вы хотите объединить его в сценарии, например PowerShell:

$gitResult = (git ls-files $_) | out-string
if ($gitResult.length -ne 0)
{
    ## do stuff with the tracked file
}
cheesus
источник
Я думаю, что file_nameдолжно быть точное совпадение (полный путь + имя файла), но может использоваться с подстановочными знаками:git ls-files *foo.rb
dechimp
16

РЕДАКТИРОВАТЬ

Если вам нужно использовать git из bash, есть --porcelainвозможность git status:

--фарфор

Дайте вывод в стабильном, простом для анализа формате для скриптов. В настоящее время это идентично выводу --short, но гарантированно не изменится в будущем, что делает его безопасным для сценариев.

Вывод выглядит так:

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

Или, если вы делаете только один файл за раз:

> git status --porcelain bla
?? bla

ОРИГИНАЛ

делать:

git status

Вы увидите отчет о том, какие файлы были обновлены, а какие нет.

Вы можете видеть bla.sh, отслеживается и изменяется и newblaне отслеживается:

# 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")
stefanB
источник
Извините, я должен был быть яснее. Состояние в порядке, но я предпочел бы проверить код выхода, чем анализировать вывод.
Дейл Форестер
git status --porcelainВаш друг, если вам нужно проанализировать вывод по сценарию, посмотрите на связанный документ, он покажет некоторые другие полезные опции
stefanB
Хихи, не работает с очень старым Git: git status --porcelain error: unknown option porcelain 'Версия 1.6.0 :-)
Laryx Decidua
@ user465139 это правильно ... вам нужен git 1.7.0 или новее (опция фарфора до этого не добавлялась).
mason81
13

Попробуйте запустить git statusфайл. Он напечатает ошибку, если он не отслеживается git

PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.
JaredPar
источник
Ух ты. Я должен был запустить его в каталоге, и он действовал так, как будто проверял весь репозиторий. Спасибо.
Дейл Форестер
4
На самом деле, если я запускаю, git status trackedfileя получаю код выхода 1 (ожидаемый 0, который будет полезен), но он не выдает мне «error:» в выходных данных. Я бы лучше проанализировал код выхода, чем вывод строки.
Дейл Форестер
43
Я обнаружил, что не возникает никакой ошибки, если я запускаю git status для файла, который существует в моей рабочей копии git, но который исключен .gitignore. (Т.е. этот ответ не подойдет.)
JellicleCat
Обратите внимание, что он не работает должным образом, если файл находится в списке игнорирования, то есть в файле.gitignore
Робин Хсу
8
Это не работает Он всегда печатает одно и то же, даже если файл не существует. $ git status notthere:On branch master nothing to commit, working directory clean
Хлоя
6

Я не знаю ни одной команды git, которая выдает «плохой» код завершения, но кажется, что простой способ сделать это - использовать команду git, которая не выводит файл, который не отслеживается, например: git-log или git-ls-files. Таким образом, вам не нужно выполнять какой-либо анализ, вы можете запустить его с помощью другой простой утилиты, такой как grep, чтобы увидеть, есть ли какие-либо выходные данные.

Например,

git-ls-files test_file.c | grep.

выйдет с нулевым кодом, если файл отслеживается, но с кодом выхода, равным единице, если файл не отслеживается.

Джей Уокер
источник
3

Я предлагаю пользовательский псевдоним на вас .gitconfig.

Вы должны сделать способ:

1) С помощью команды git:

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

2) Редактирование ~/.gitconfigи добавление этой строки в разделе псевдонимов:

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

После запуска команды (1) или сохраненного файла (2) в своей рабочей области вы можете проверить это:

$ git check-file
$ Filename missing 

$ git check-file README.md
$ File tracked 

$ git check-file foo
$ File not tracked
Лука Даванцо
источник
2

Использование git logдаст информацию об этом. Если файл отслеживается в git, команда показывает некоторые результаты (логи). Остальное пусто.

Например, если файл отслеживается 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
....
....

Если файл не отслеживается,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
root@user-ubuntu:~/project-repo-directory#
SuperNova
источник
1

Просто мои два цента:

git ls-files | grep -x relative/path

где relative/pathможно легко определить, нажав tabвнутри оболочки автозаполнения. Добавьте дополнительный, | wc -l чтобы получить 1 или 0 выход.

andreee
источник
В зависимости от пути (например, если он содержит точку), вы должны добавить grepопцию --fixed-strings.
EndlosSchleife