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

c8ib6hqw  于 2023-02-28  发布在  Git
关注(0)|答案(9)|浏览(198)

是否有办法通过运行某个git命令并检查其退出代码来判断文件是否正在被跟踪?
换句话说:git正在跟踪一个文件吗?

gev0vcfq

gev0vcfq1#

尝试:

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

如果未跟踪文件,将退出并返回1

q8l4jmvw

q8l4jmvw2#

如果您不想让控制台充斥着错误消息,还可以运行

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
}
b5lpy0ml

b5lpy0ml3#

    • 编辑**

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

  • -瓷器
    以稳定、易于解析的格式输出脚本。目前这与--short output相同,但保证将来不会更改,使脚本安全。
    输出如下所示:
> git status --porcelain
 M starthudson.sh
?? bla

或者,如果一次只处理一个文件:

> git status --porcelain bla
?? bla
    • 原件**

执行:

git status

您将看到报告,说明哪些文件已更新,哪些是untracked。
您可以看到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")
mrwjdhj3

mrwjdhj34#

尝试在文件上运行git status,如果git没有跟踪,它会输出一个错误

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

mkshixfv5#

我不知道有哪个git命令会给出一个"坏"的退出代码,但看起来一个简单的方法是使用一个git命令,对一个没有被跟踪的文件不给出任何输出,比如git-log或git-ls-files,这样你就不需要做任何解析,你可以通过另一个简单的实用程序比如grep来运行它,看看是否有任何输出。
例如,
git-ls-文件测试文件. c|格雷普
如果文件被跟踪,将退出,代码为0;如果文件未被跟踪,退出代码为1。

ecfsfe2w

ecfsfe2w6#

我建议在.gitconfig中使用自定义别名
你有两种方法可以做到这一点:
1.使用git命令:
git config --全局别名。check-file〈下面的命令〉
1.编辑~/.gitconfig并在alias部分添加以下行:
[别名]检查文件=“!f(){ if [ $# -eq 0 ];然后回显“缺少文件名!”;否则跟踪=$(git ls文件${1});如果 -z ${跟踪} ;则回显“未跟踪文件”;else echo '文件已跟踪';fi; fi; }; f”
启动命令(1)或保存文件(2)后,可以如下所示进行测试:

$ git check-file
$ Filename missing 

$ git check-file README.md
$ File tracked 

$ git check-file foo
$ File not tracked
pnwntuvh

pnwntuvh7#

使用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#
esyap4oy

esyap4oy8#

就我的两点意见:
git ls-files | grep -x relative/path
其中relative/path可以通过在自动完成shell中按tab轻松确定。添加额外的| wc -l可获得1或0输出。

vbopmzt1

vbopmzt19#

我更喜欢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

相关问题