有没有一种方法可以通过运行一些git命令并检查其退出码来判断一个文件是否正在被跟踪?
换句话说:git在跟踪文件吗?
有没有一种方法可以通过运行一些git命令并检查其退出码来判断一个文件是否正在被跟踪?
换句话说:git在跟踪文件吗?
当前回答
我更喜欢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
其他回答
我的观点是:
Git ls-files | grep -x相对/路径
在自动补全shell中,可以通过按TAB键轻松确定相对/路径。添加额外的| wc -l以获得1或0输出。
我不知道有哪个git命令给出了一个“糟糕的”退出码,但似乎有一种简单的方法可以做到这一点,那就是使用一个git命令,它不会为没有跟踪的文件提供输出,比如git-log或git-ls-files。这样就不需要进行任何解析,可以通过另一个简单的实用程序(如grep)来运行它,以查看是否有任何输出。
例如,
Git-ls-files test_file.c | grep。
如果文件被跟踪,将以0代码退出,但如果文件未被跟踪,则退出代码为1。
我更喜欢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
使用git日志将提供有关此的信息。如果文件在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#
我建议您使用.gitconfig自定义别名。
你必须这样做:
1)使用git命令:
git config --global alias.check-file <command>
2)编辑~/。在alias部分添加这一行:
[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