有没有办法通过运行一些git
命令并检查其退出代码来判断是否正在跟踪文件?
换句话说:git是否跟踪文件?
答案 0 :(得分:383)
尝试:
git ls-files --error-unmatch <file name>
如果未跟踪文件,将以1退出
答案 1 :(得分:51)
如果您不想使用错误消息弄乱控制台,也可以运行
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
}
答案 2 :(得分:15)
修改强>
如果你需要在bash中使用git,git status
有--porcelain
个选项:
- 瓷
以稳定,易于解析的格式提供输出 脚本。目前这是相同的 - 短输出,但保证 做到这一点,不要改变未来 脚本安全。
输出如下:
> git status --porcelain
M starthudson.sh
?? bla
或者,如果您一次只执行一个文件:
> git status --porcelain bla
?? bla
<强> ORIGINAL 强>
做的:
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")
答案 3 :(得分:12)
尝试在文件上运行git status
。如果没有被git跟踪,它将打印错误
PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.
答案 4 :(得分:6)
我不知道任何给出“坏”退出代码的git命令,但似乎一种简单的方法就是使用git命令,不为没有跟踪的文件提供输出,例如git-log或git-ls-files。这样你就不必进行任何解析,你可以通过另一个简单的实用程序如grep来运行它,看看是否有任何输出。
例如,
如果跟踪文件,git-ls-files test_file.c | grep。
将以零代码退出,如果未跟踪文件,则退出代码为1。
答案 5 :(得分: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
答案 6 :(得分:1)
只是我的两分钱:
git ls-files | grep -x relative/path
通过在自动完成shell中按relative/path
可以轻松确定tab
。添加额外的| wc -l
以获得1或0输出。
答案 7 :(得分: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
....
....
如果文件未跟踪git,
root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
root@user-ubuntu:~/project-repo-directory#
答案 8 :(得分:0)
我更喜欢 git log -1 --oneline
而不是 git ls-files
,因为 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