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

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

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

10 ответов

Решение

Пытаться:

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

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

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

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
}

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

If you need to use git from bash there is --porcelain возможность git status:

--фарфор

Give the output in a stable, easy-to-parse format for scripts. Currently this is identical to --short output, but is guaranteed not to change in the future, making it safe for scripts.

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

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

Or if you do only one file at a time:

> git status --porcelain bla
?? bla

ОРИГИНАЛ

делать:

git status

You will see report stating which files were updated and which ones are untracked.

Ты можешь видеть bla.sh is tracked and modified and newbla is not tracked:

# 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 в файле. Он напечатает ошибку, если он не отслеживается git

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

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

Например,

git-ls-files test_file.c | grep.

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

Я предлагаю свой псевдоним на вас .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

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

git ls-files | grep -x relative/path

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

С помощью 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#
      if git rev-parse -q --verify :path/to/file >&-
then echo it\'s tracked
else echo it\'s not
fi

Я бы предпочел, потому что команда git log не перемещается по каталогу, поэтому вывод будет аналогичным независимо от того, является ли проверяемый путь файлом или каталогом.

Вот пример вывода для git ls-files:

      vinegupt@bhoscl88-04(/imsgit_local/work/vinegupt/ims_21.8/ims_oam/MT)$ git ls-files untracked-file # Untracked file shows no output
vinegupt@bhoscl88-04(/imsgit_local/work/vinegupt/ims_21.8/ims_oam/MT)$ git ls-files form/data.json # tracked file shows its name again
form/data.json
vinegupt@bhoscl88-04(/imsgit_local/work/vinegupt/ims_21.8/ims_oam/MT)$ git ls-files form # For directory entire directory is traveresed
form/Traffic_Params_2M_IS_cont_GVolte_EATF.xls
form/data.json

Пример вывода для git log -1 --oneline:

      vinegupt@bhoscl88-04(/imsgit_local/work/vinegupt/ims_21.8/ims_oam/MT)$ git log -1 --oneline untracked-file # Untracked file shows no output
vinegupt@bhoscl88-04(/imsgit_local/work/vinegupt/ims_21.8/ims_oam/MT)$ git log -1 --oneline form/data.json # tracked file shows one-line output
e8e9e0f CONTAINERS-767 MT and release change for 21.8
vinegupt@bhoscl88-04(/imsgit_local/work/vinegupt/ims_21.8/ims_oam/MT)$ git log -1 --oneline form # Only directory info is given no traversal
e8e9e0f CONTAINERS-767 MT and release change for 21.8
Другие вопросы по тегам