只有通过了解仓库中的单个文件才能获得git仓库的顶级产品?

时间:2016-09-27 04:31:31

标签: git

我有一个文件,我认为可能在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目录的原因。

3 个答案:

答案 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 2d92ab3Jeff 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