创建分支别名并推送它

时间:2014-07-31 16:35:13

标签: git github version-control

如何创建分支别名,使其可以被推拉,而不会被视为单独的分支。 一些背景:

我们有一个名为Production的分支。由于各种原因,我不能只重命名分支。

$ git branch --all
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/Production
  remotes/origin/master

有时候我会git checkout production错误而不会注意到它是一个新的分支。没有远程分支production。也没有引用origin/production

$ git checkout production
Branch production set up to track remote branch production from origin.
Switched to a new branch 'production'
$ git status
On branch production
Your branch is up-to-date with 'origin/production'.

nothing to commit, working directory clean
$ git branch --all
  master
* production
  remotes/origin/HEAD -> origin/master
  remotes/origin/Production
  remotes/origin/master

Git创建了一个本地分支production,声称它正在跟踪远程分支production。现在,如果我提交并推送或只是推动git将推动一个新的分支。不是我想要的。

$ git push
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:path/repo.git
 * [new branch]      production -> production

然后我必须退后一步

$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
$ git branch -d production
warning: deleting branch 'production' that has been merged to
         'refs/remotes/origin/production', but not yet merged to HEAD.
Deleted branch production (was bc6d7a2).
$ git push origin :production
To git@github.com:path/repo.git
 - [deleted]         production
$ git checkout Production
error: pathspec 'Production' did not match any file(s) known to git.

不知怎的,现在我失去了Production,直到我再次拉它。 git是否区分大小写?

$ git branch --all
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$ git pull
From github.com:path/repo
 * [new branch]      Production -> origin/Production
Already up-to-date.
$ git checkout Production
Branch Production set up to track remote branch Production from origin.
Switched to a new branch 'Production'
Your branch is up-to-date with 'origin/Production'.

现在推动并没有推动新的分支。其实我想要的是什么。

$ git push
Everything up-to-date

我的第一个想法是创建一个名为Production的{​​{1}}分支的别名,但我希望它能够被推拉,好像两者实际上是同一个东西。这是我不知道该怎么做的事情。其他问题中的所有别名方法似乎只是本地别名。

如果您对我的问题有不同的解决方案,我也希望听到它。

作为附注,如果你能告诉我为什么git有时会区分大小写,有时候不是。

2 个答案:

答案 0 :(得分:2)

OP在评论中提及branch alias

git symbolic-ref refs/heads/production refs/heads/Production

这确实在本地解决了问题,并且比下面提到的钩子更简单 那些钩子可以在那里确保两个分支保持同步。

在这两种情况下,都涉及到对所有团队成员进行本地配置,尽管我提到了" templatedir"最后,自动化钩子传播。


Using hooks,您可以创建一个post-commit挂钩,以确保将本地分支production设置为与Production分支相同的提交。 (或者,如果您在production分支上提交,Production设置为与production分支相同的提交) 这样,两个分支总是引用相同的提交,你可以从任何一个提取。

pre-push hook(git 1.8.2+),可以:

  • 检查推送哪个分支(生产或生产)
  • 触发推送其他分支

这样,即使将git config push.default设置为simple(意味着您只是推送当前分支),即使您推错了({{ 1}} => production),origin/production挂钩可以负责推送另一个(pre-push => Production

由于两个分支都被推动,因此拉动将始终至少更新其中一个分支 并且提交后挂钩将确保另一个挂起。

目标是不再关心您正在处理的分支(origin/ProductionProduction)。


您可以在shared template Git repo folder中添加这些挂钩,这将允许任何团队成员在其新克隆的仓库中获取这些挂钩,前提是他们的production全局配置引用为共享文件夹。

答案 1 :(得分:1)

作为未来读者的替代方案,我考虑创建一个production orphaned branch并放置一个文件,以便在错误的分支上显而易见。

git checkout --orphan production
touch wrong-branch

这可以是可移植的,但是不会让production分支的行为像我真正想要的Production分支一样(并且似乎不可能)

如果(出于某种未知原因)有人在实时服务器上并且错误地执行了git checkout production,这可能会导致实时服务器中断。