繁体   English   中英

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

[英]git: short status with NUL-terminated names AND relative paths

我想以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来查找具有realpath完整硬路径,无论如何realpath类似POSIX的环境。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM