如何在分离 HEAD 状态下找到当前的 git 分支

15 浏览
0 Comments

如何在分离 HEAD 状态下找到当前的 git 分支

我可以通过以下方式找到当前的git分支名称:

git branch | awk '/^\*/ { print $2 }'
git describe --contains --all HEAD

但是在分离的HEAD状态下,例如在Jenkins的maven构建的后期构建阶段(或在Travis的git fetch中),这些命令不起作用。

我目前的解决方案是:

git show-ref | grep $(git log --pretty=%h -1) | sed 's|.*/\(.*\)|\1|' | sort -u | grep -v HEAD

它显示了任何具有在其HEAD尖端的最后提交的分支名称。这个方法很好用,但我觉得可能有更漂亮的解决方案,懂得更多git技巧的人可能会有更好的方法。

0
0 Comments

如何在游离状态下寻找当前的git分支?

当我们在git中使用`git checkout`命令切换到一个具体的提交时,就会进入游离状态(detached HEAD state)。在这种状态下,我们不再位于任何分支上,而是直接位于一个具体的提交上。在这种情况下,我们可能会遇到一个问题,即如何找到当前的git分支。

解决这个问题的方法是使用`git branch --contains HEAD`命令。这个命令会返回包含当前提交的所有分支。如果没有任何分支包含当前提交,命令会返回"discarding (no branch)"的提示信息。

需要注意的是,由于我们处于游离状态,可能有多个分支包含当前提交。这取决于我们进入游离状态的方式以及之后的操作。如果我们采用了快进合并(fast-forward merge)的方式进入游离状态,那么可能有多个分支包含当前提交。

如果我们想要获取一个有用的分支(即不是HEAD)的名称,可以使用`git branch --contains HEAD | grep -v HEAD`命令。这个命令会过滤掉包含HEAD的分支,只返回其他分支的名称。

总结起来,我们可以通过以下步骤找到当前的git分支:

1. 使用`git branch --contains HEAD`命令查看包含当前提交的所有分支。

2. 使用`git branch --contains HEAD | grep -v HEAD`命令过滤掉包含HEAD的分支,只返回其他分支的名称。

希望以上内容能帮助到你解决在游离状态下寻找当前git分支的问题。

0
0 Comments

如何在分离头状态下找到当前的git分支

在使用git时,有时会发生分离头(detached HEAD)的情况,即当前工作树不在任何一个分支上。在这种情况下,我们可能需要找到当前的git分支。下面是一些解决方法:

1. 使用git log命令:

git log -n 1 --pretty=%d HEAD

这个命令会显示最近一次提交的引用,其中包含当前分支的信息,例如:(HEAD, master)。如果想在脚本中使用这个信息,需要对其进行解析。

2. 使用git show命令:

git show -s --pretty=%d HEAD

这个命令和上面的git log命令类似,同样会显示最近一次提交的引用,包含当前分支的信息。同样需要解析这个信息。

3. 使用git for-each-ref命令:

git for-each-ref --format='%(objectname) %(refname:short)' refs/heads | awk "/^$(git rev-parse HEAD)/ {print \$2}"

这个命令会列出所有本地分支的引用,并通过awk命令匹配当前分离头的引用,然后打印出对应的分支名。

4. 使用git show命令结合tr、grep和head命令:

git show -s --pretty=%D HEAD | tr -s ', ' '\n' | grep -v HEAD | head -n1

这个命令会显示包含当前分支的信息,可以通过管道和其他命令进行处理,最终输出当前分支的名字。

在分离头状态下找到当前的git分支可以通过上述方法实现。每种方法都有其优缺点,可以根据具体需求选择合适的方法来解决这个问题。

0
0 Comments

在分离头状态下如何找到当前的git分支

在使用Jenkins时,我需要一个稍微不同的解决方案,因为Jenkins没有分支的本地副本。所以当前的提交必须与远程分支匹配:

git ls-remote --heads origin | grep $(git rev-parse HEAD) | cut -d / -f 3

或者在没有网络的情况下:

git branch --remote --verbose --no-abbrev --contains | sed -rne 's/^[^\/]*\/([^\ ]+).*$/\1/p'

值得注意的是,当你在同一个提交下有多个分支头时,这可能会返回多个分支名。

更新:

我刚刚注意到Jenkins设置了GIT_BRANCH环境变量,其中包含类似origin/master的值。这也可以用于在Jenkins中获取git分支:

echo $GIT_BRANCH | cut -d / -f 2

我认为--format=%(refname:lstrip=-2)可以避免使用sed命令。

我和OP在使用gitlab-runner时遇到了相同的问题,目前为止,“without network”解决方案是最好的!谢谢!

0