我试图使用git命令找到工作分支名称。当然,我可以在本地(windows)机器中获得正确的分支名称。如果我在预接收挂钩文件中使用相同的命令意味着它只打印<select ng-model="search" ng-options="names.value as names.code for names in msg.codes">
</select>
。但在本地,我得到了我工作的分支名称。
命令是
master
令人费解!任何人都建议在git hook文件(#!/usr/bin/env bash
echo `git rev-parse --abbrev-ref HEAD`
echo `git symbolic-ref --short HEAD`
echo `git branch | sed -n '/\* /s///p'`
echo `git status | head -1`
echo `git describe --all`
hook)中获取工作分支名称的正确方法
答案 0 :(得分:1)
TL; DR:我认为你错误地解释了预接收挂钩的作用以及预接收挂钩运行的存储库的HEAD
。
对于我来说,“工作分支名称”的含义并不完全清楚。但是,所有存储库确实具有HEAD
,而git symbolic-ref --short HEAD
将打印HEAD
指向的分支的名称(“当前分支”) ),即使那个分支还不存在;如果它没有指向分支名称(或者是一个分离的HEAD),则失败。
那是:
$ mkdir tt
$ cd tt
$ git init
Initialized empty Git repository in .../tt/.git
$ git symbolic-ref --short HEAD
master
即使:
$ git branch
(请注意,没有输出)
$ git rev-parse HEAD
HEAD
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
(git rev-parse HEAD
失败)
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
(当前分支为master
,但没有提交。
所以git symbolic-ref --short HEAD
可能是您正在考虑的事情。 (请注意,上述所有内容在新--bare
存储库中将继续有效或失败,但git status
除外,fatal: This operation must be run in a work tree
除外。{/ p>
这一点没有意义的主要原因是你还提到了预接收挂钩,预接收挂钩主要用于接收和接受推送请求的集中式服务器“裸”存储库。请记住,裸存储库是没有工作树的存储库。在裸存储库中,HEAD
指向的分支的名称几乎完全没用。它有一个实际的功能:如果运行git clone
的人没有指定要检出的特定名称,它将确定该存储库的git clone
将检出哪个分支。 1 在普通的非裸存储库中,HEAD
将是填充该非裸存储库的工作树的分支的名称;但由于裸存储库没有工作树,HEAD
没有这样做。
但是,一般来说,预接收挂钩没有咨询当前分支的业务。运行预接收挂钩,其标准输入连接到将提供一行或多行输入的流。每一行都有以下形式:
old-hash new-hash reference-name
如,
3b136a71d875174d7539bf98080b85eaf415ba73 95ec6b1b3393eb6e26da40c565520a8db9796e9f refs/heads/foobranch
0000000000000000000000000000000000000000 0452b4b5786778d5d87f5c90a94fab8936502e20 refs/tags/v2.1.0
在这种情况下表示发送Git希望接收Git将分支foobranch
从其当前值3b136a71d875174d7539bf98080b85eaf415ba73
更新为新值95ec6b1b3393eb6e26da40c565520a8db9796e9f
,并创建标记{ {1}}指向对象v2.1.0
。
这些都不会以任何方式依赖于当前分支。 这些更新请求由执行0452b4b5786778d5d87f5c90a94fab8936502e20
的Git提供。由于接收存储库(假设您可以检查是否喜欢)git push
,它没有工作树并且创建标记或替换--bare
的值,因此不会影响非 - 以任何方式存在的工作树。
1 也就是说,当其他人复制这个裸存储库时,其他人可以说foobranch
,但如果是其他人不说-b <branch-or-tag>
,其他人的Git会向裸存储库Git询问其-b <branch-or-tag>
所代表的分支,然后设置好像其他人指定了 作为HEAD
参数。