错误的约会在预先接收挂钩

时间:2017-12-15 08:32:49

标签: git git-branch git-bash githooks

我试图使用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)中获取工作分支名称的正确方法

1 个答案:

答案 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参数。