我希望git
格式status -s
输出{/ 1}}
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
- 终止?
答案 0 :(得分:1)
你不能直接得到你想要的东西。但是,由于-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的环境。)