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


357

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

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


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

Ответы:


444

пытаться:

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

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


По крайней мере, в моей более старой (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
}

Я думаю, что 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")

Извините, я должен был быть яснее. Состояние в порядке, но я предпочел бы проверить код выхода, чем анализировать вывод.
— Дейл Форестер

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.

Ух ты. Я должен был запустить его в каталоге, и он действовал так, как будто проверял весь репозиторий. Спасибо.
— Дейл Форестер

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#

1

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

git ls-files | grep -x relative/path

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


В зависимости от пути (например, если он содержит точку), вы должны добавить grepопцию --fixed-strings.
— EndlosSchleife
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.