例子:
$ cd lib
$ git absolute-path test.c # how to do this?
lib/test.c
test.c
是相对于当前工作目录的路径。所以,当你已经知道文件在哪里,但是想要将路径转换为相对于存储库根目录的“绝对”路径时,可以使用这些命令。如果你正在尝试搜索 repo 中是否存在名为 test.c
的文件,我建议运行cd "$(git rev-parse --show-toplevel)"; git ls-files --full-name '*/test.c' 'test.c'
。注意引号,以防止 shell 插值星号。 - Jo Lissgit-absolute-path () {
fullpath=$([[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}")
gitroot="$(git rev-parse --show-toplevel)" || return 1
[[ "$fullpath" =~ "$gitroot" ]] && echo "${fullpath/$gitroot\//}"
}
git-absolute-path test.c
if gitroot=$(git rev-parse --show-toplevel 2>/dev/null); then
directory=$(realpath --relative-to="$gitroot" .)
fi
我希望在@gmatht的答案基础上进行改进,使其适用于一些边缘情况,通过不同的方式解析git根目录:
git-absolute-path () {
fullpath=$([[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}")
gitroot="$(echo $(cd $(git rev-parse --show-cdup) .; pwd))" || return 1
[[ "$fullpath" =~ "$gitroot" ]] && echo "${fullpath/$gitroot\//}"
}