我想获得格式为status -s
:的git
输出
genesis% git status -s .
?? .config/aria2/
?? .config/htop/
?? .config/mc/
?? .config/pacman/
?? .config/remmina/
?? .config/teamviewer/
?? .config/zsh/
但我希望这个以"\0"结尾的文件名列表能够安全地处理名称中包含奇怪字符的文件。
genesis% git status -z . | xargs -0n1 echo
?? misc/.config/aria2/
?? misc/.config/htop/
?? misc/.config/mc/
?? misc/.config/pacman/
?? misc/.config/remmina/
?? misc/.config/teamviewer/
?? misc/.config/zsh/
正如您所看到的,-z
输出提供了相对于存储库根(附加的misc
)的路径。
如何获得像第一个示例中那样的相对路径名,但仍然以NUL
结尾?
你不能直接得到你想要的东西。但是,由于-z
是供代码而非人类使用的,因此您可以使用git rev-parse --show-cdup
:添加一些自己的代码来执行您想要的操作
$ git rev-parse --show-cdup
../
这意味着当前工作目录中"缺少"了一个顶级组件,因此在通过-z
获得限制为当前目录的条目后,应该去掉每个名称的第一个组件。如果--show-cdup
打印../../
,则需要剥去两个,依此类推
请注意,当没有要剥离的组件时,--show-cdup
不打印任何内容,或者更准确地说,打印一条空行。因此,计算--show-cdup
输出中../
(甚至只有/
)的数量可以得到要剥离的前导路径名组件的正确数量。
(如果您提供的参数不是.
到git status
,您将需要更多:测试参数是否是目录,如果是,则将cd
放入其中并运行git rev-parse --show-cdup
,如果是文件,则将其目录名或.
、cd
放入其中,然后运行git rev-parse --show-cdup
。从子进程执行所有这些操作,以避免修改主进程的当前工作目录。这种相当复杂的方法避免了必须编写路径名解析器来处理任意数量的./
和../
组件,但您也可以采用另一种方法,直接使用realpath
获得完整的硬路径,假设环境类似POSIX。)