我有一个文件,我认为可能在git repo中。我目前在我的主目录中。如何在不更改当前工作目录的情况下获取repo的顶级目录?
如果我在回购中,我可以运行以获取根目录。
(~/code/dir1) $ git rev-parse --show-toplevel
实际上我希望能够使用文件直接找到git目录的根目录。
(~) $ find . -name "specific_file.py"
树的重要部分是:
~/code/dir1/.git
~/code/dir1/files/more_files/specific_file.py
有没有这样做的git方法,或者是通用的shell操作最好的方法呢?
我知道我能做到:
(~) $ cd $(dirname $(find . -name "specific_file.py"))
(~/code/dir1/files/more_files) $ git rev-parse --show-toplevel
~/code/dir1
(~/code/dir1/files/more_files) $ cd -
如果我在没有进入回购的情况下尝试,我会收到消息:
Fatal '~/code/dir1/files/more_file/specific_file.py' is outside repository
如果我尝试将git目录设置为在树的下方:
git --git-dir=$(dirname $(find . -name "specific_file.py")) rev-parse --show-toplevel
它告诉我,我没有在git目录中工作。
我也尝试过使用工作树,但这似乎不是我直接在路径上直接查找/.git目录的原因。
答案 0 :(得分:2)
在详细阅读了手册页后,我需要-C
标记,而不是--git-dir
或--work-dir
标记。
git -C $(dirname $(find . -name "specific_file.py")) rev-parse --show-toplevel
我的解释是,如果使用子模块/子树,多个-C
标志可能会有用。
来自git手册页:
像启动git而不是当前工作一样运行 目录。当给出多个-C选项时,每个后续 非绝对-C是相对于前面的-C来解释的
此选项会影响期望路径名称的选项,例如--git-dir和 --work-tree,因为它们对路径名的解释将相对于由-C选项引起的工作目录。对于 例如,以下调用是等效的:
答案 1 :(得分:1)
尝试更改子shell中的目录,然后调用git rev-parse --show-toplevel
。你会马上回到你开始的地方,掌握你想要的信息!
注意:$OSTYPE
回转是由于OSX附带的-f|--canonicalize
的BSD版本中缺少readlink
标志。 osx的另一种选择是brew install greadlink
并设置一个局部变量,如readlink=$(command -v greadlink readlink | head -n 1)
,然后调用${readlink} -f
。
abspath()
{
case $OSTYPE in
darwin*) python -c 'import sys, os.path; print os.path.abspath(sys.argv[1])' $1;;
linux*) readlink -f $1;;
esac
}
topgit()
{
[ -e "$1" ] || { echo >&2 "$1 does not exist"; return 1; }
abspath=`abspath $1`
(
[ -f "$abspath" ] && cd `dirname $abspath` || cd $abspath
git rev-parse --show-toplevel
)
}
答案 2 :(得分:0)
如果您使用的是git rev-parse --show-toplevel
(和you are not in a submodule),请确保使用Git 2.25(2020年第一季度)
“ git rev-parse --show-toplevel
”在任何工作树的外部 运行 not 错误,已纠正。
请参见commit 2d92ab3的Jeff King (peff
)(2019年11月19日)。
(由Junio C Hamano -- gitster
--在commit 36fd304中合并,2019年12月5日)
rev-parse
:将没有工作树的--show-toplevel设置为错误签名人:杰夫·金
自7cceca5ccc中引入以来(“添加'git rev-parse --show-toplevel'选项。”,2010年1月12日,Git v1.7.0-rc0-{{3} }在merge中列出,
--show-toplevel
选项已将丢失的工作树视为成功,它既不打印顶层路径,也不报告任何错误。尽管呼叫者可以通过查找空响应来区分这种情况,但其行为却令人困惑。
我们最好不要抱怨没有工作树,就像其他内部命令在类似情况下一样(例如,“git status
”或任何内置NEED_WORK_TREE
的内置命令都只会die()
) 。
所以我们在这里做同样的事情。我们正在讨论的同时,让我们澄清文档并添加一些测试,以测试新行为以及更普通的情况(未涵盖)。
现在出现错误(Git 2.25+)消息是:
this operation must be run in a work tree