正确而快速的方法来测试git目录和git分支?

Modified on: Mon, 03 Dec 2018 20:20:03 +0800

在尝试设置我的新鱼壳提示时,我最终测试了获取分支名称的方法并且还测试我是否在git存储库中。我找到(1) git rev-parse --abbrev-ref HEAD(2) git symbolic-ref HEAD | sed 's/refs\/heads\///'(3) git describe --contains --all HEAD做得很好。

我很好奇,因为我喜欢(1)的简单性,但是对于一个新的,未受影响的(只是git init ed)存储库,它给了我一个“致命:“错误,而(2)按预期工作,即给我一个默认的作为输出。问题是,即使出现“致命:”错误,返回码为0.这是预期的行为吗?

为了测试我是否在git存储库中,我最终只是测试当前目录是否有“.git”文件夹:test -d ".git"。基本的解决方案,但它的工作原理,使用任何git命令似乎更快。

所以,我的问题是:

  1. (1)不应该返回与0不同的退出代码“致命:”?如果它确实是一个错误,因为我不知道git人们如何标准化他们的返回代码,我应该在哪里报告?
  2. 我知道如果我用^ /dev/null重定向(1)(对于那些不知道的人,^是与2>相同,我不会得到错误,但它会说HEAD而不是master,但如果我cat .git/HEAD,我得到:ref: refs/heads/master。它究竟应该说什么?使用master,我只是无知和挑剔,因为它应该改为HEAD?我的意思是只有git init ed repository。
  3. 您是否在寻求获得良好提示的过程中对任何可能的解决方案进行了基准测试?
  4. 醇>

    这是我用来基准测试的代码(对于鱼):

    set -l before (date +%s%N)
    git rev-parse --abbrev-ref HEAD
    set -l after (date +%s%N)
    set -l elapsed_time (expr $after - $before)
    echo $elapsed_time
    

    提前致谢!

    PS:这些工具是最新的GNU版本,我的意思是seddateexpr。如果信息太多或者某些事情没有任何意义,我很抱歉。忍受我。谢谢!

    编辑:正如有人在答案中正确猜到的那样,整个错误是:

    fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
    Use '--' to separate paths from revisions
    

最佳答案

没有完全回答你的问题,但可能不仅仅是评论:

  1. 根据您答案中的其他评论,我认为您看到的错误是fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.之所以发生这种情况,是因为您'在一个全新的git存储库上进行这些测试,这个存储库没有任何承诺的工作。这不仅不是一个公平的测试(根据定义,您的性能会在更大的存储库中更糟),它几乎在所有方面都是一个优势。例如,.git/HEAD按惯例显示ref: refs/heads/master。抛出错误是因为HEAD不明确。您没有历史记录,因此传递给rev-parse的任何值都将被视为相同。另外,这对我来说不会退出0:

    $ git init /tmp/test && cd /tmp/test
    $ git rev-parse --abbrev-ref HEAD
    $ echo $?
    128
    

    总之,不要冒这个错误。抓住你自己的巨大的android repos之一,或者也许是Linux内核,测试你的提示。

  2. HEAD不是分支。它是指向签出状态的指针。当您检出分支时,它是该分支的符号引用。当您处于'分离的HEAD'状态时,HEAD指针指向提交。使用方法(1)得到HEAD作为返回,因为rev-parse只是在错误中回显传递的refspec值。尝试使用blah;你会看到同样的事情。

  3. 我实际上并没有对解决方案进行基准测试,但是你可能会尝试一些事情(两者都在我的zsh提示中使用,我没有写过,而且两者都表现得很好):

    git rev-parse --is-inside-work-tree ;# avoids your 'test -d .git' call
    ref=$(git symbolic-ref HEAD 2> /dev/null) ;# grab the full refspec
    branch=$(echo ${ref#refs/heads/}) ;# extract the branch name
    
  4. 醇>
作者:,Christopher

相关问答

添加新评论