git:具有NUL终止名称和相对路径的短状态

时间:2017-01-16 08:01:04

标签: git

我希望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 - 终止?

1 个答案:

答案 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的环境。)