如何判断文件是否被git跟踪(通过shell退出代码)?

Dal*_*ter 323 git

有没有办法通过运行某些git命令并检查其退出代码来判断是否正在跟踪文件?

换句话说:是git跟踪文件?

has*_*sen 408

尝试:

git ls-files --error-unmatch <file name>
Run Code Online (Sandbox Code Playgroud)

如果未跟踪文件,将以1退出

  • `git ls-files | grep <PATTERN>`?例如:`git ls-files | grep Main.h` (28认同)
  • [天真的方法]对文件进行一些小的更改(添加/删除空格)。并查看键入“git status”时是否列出该文件。一个愚蠢的方法,但可能会节省时间。 (2认同)
  • 请注意,即使您使用的是 Windows,匹配也会区分大小写。 (2认同)

che*_*ica 56

如果您不想使用错误消息使控制台变得杂乱,您也可以运行

git ls-files file_name
Run Code Online (Sandbox Code Playgroud)

然后检查结果.如果git没有返回任何内容,则不会跟踪该文件.如果它被跟踪,git将返回文件路径.

如果要将其组合在脚本中(例如PowerShell),这会派上用场:

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


ste*_*anB 15

编辑

如果你需要使用bash中的git,可以--porcelain选择git status:

- 瓷

为脚本提供稳定,易于解析的输出格式.目前这与--short输出相同,但保证将来不会改变,使脚本安全.

输出如下:

> git status --porcelain
 M starthudson.sh
?? bla
Run Code Online (Sandbox Code Playgroud)

或者,如果您一次只执行一个文件:

> git status --porcelain bla
?? bla
Run Code Online (Sandbox Code Playgroud)

原版的

做:

git status
Run Code Online (Sandbox Code Playgroud)

您将看到报告,说明哪些文件已更新以及哪些文件未被跟踪.

您可以看到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")
Run Code Online (Sandbox Code Playgroud)


Jar*_*Par 11

尝试git status在文件上运行.如果它没有被git跟踪,它将打印错误

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

  • 我发现如果我在我的git工作副本中存在但是被.gitignore排除的文件上运行git status,则不会引发错误.(即这个答案不会.) (41认同)
  • 这不起作用.它总是打印相同的东西,即使该文件不存在.`$ git status notthere`:`在分支主机上没什么可提交的,工作目录清理` (7认同)
  • 实际上,如果我运行`git status trackedfile`,我会得到退出代码1(预期0有用),但它不会在输出中给出"error:".我宁愿解析退出代码而不是字符串输出. (4认同)
  • 不起作用 - git版本1.9.1 (2认同)

Luc*_*nzo 7

我建议在您.gitconfig.

您有两种方法可以做到这一点:

  1. 使用 git 命令:
    git config --global alias.check-file <command below>
Run Code Online (Sandbox Code Playgroud)
  1. ~/.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"
Run Code Online (Sandbox Code Playgroud)

启动命令 (1) 或保存文件 (2) 后,您可以像这样测试它:

$ git check-file
$ Filename missing 

$ git check-file README.md
$ File tracked 

$ git check-file foo
$ File not tracked
Run Code Online (Sandbox Code Playgroud)


Jay*_*ker 6

我不知道任何给出"坏"退出代码的git命令,但似乎一种简单的方法就是使用git命令,不为没有跟踪的文件提供输出,例如git-log或git-ls-files.这样你就不必进行任何解析,你可以通过另一个简单的实用程序如grep运行它来查看是否有任何输出.

例如,

git-ls-files test_file.c | grep.

如果跟踪文件,则将以零代码退出;如果未跟踪文件,则退出代码为1.