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

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

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

尝试:

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

如果文件没有被跟踪,将会以1退出

如果您不想用错误信息弄乱控制台,也可以运行

 git ls-files file_name 

然后检查结果。 如果git没有返回,那么文件不被跟踪。 如果跟踪,git将返回文件path。

如果要将其合并到脚本中,这非常方便,例如PowerShell:

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

编辑

如果你需要从bash中使用git,可以使用--porcelain选项来指定git status

– 瓷

为脚本提供稳定的,易于parsing的格式输出。 目前这与–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 。 如果没有被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。 这样你不需要做任何parsing,你可以通过另外一个简单的工具来运行它,比如grep来查看是否有输出。

例如,

git-ls-files test_file.c | grep。

如果文件被跟踪,将以零代码退出,但如果文件未被跟踪则退出代码为1。

我build议您在.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),在您的工作空间,您可以testing它:

 $ 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可以通过按下自动完成shell中的tab轻松确定。 添加一个额外的| wc -l | wc -l得到1或0的输出。

使用git log会给这个信息。 如果在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#