推特除了特殊的分支

时间:2017-01-05 21:52:29

标签: git git-push

我和我的队友正在OpenShift上开展同一个项目。我们有几个必须在服务器上的分支,所以我们使用命令push --all,我们每个人(我和我的队友)都希望有一个本地分支(称为LocalTest)用于本地测试和开发所以问题是当我们使用push --all时,对所有包含LocalTest的分支都进行了原始分支。

顺便说一下,我忘了指出,有时我们需要将其他分支合并到我们的本地分支,特别是在从服务器提取新的提交之后,还想从我们的本地分支机构中挑选甚至合并(很少)其他分支机构将推送到服务器。

git中是否有任何命令,如git push --all except branch-name,我们问题的最佳解决方案是什么?

3 个答案:

答案 0 :(得分:2)

  

git push --all except master也是一个好的开始

问题是:refspec模式非常有限。

refspec documentation很清楚:

  

您不能在模式中使用部分glob,所以这将是无效的:

fetch = +refs/heads/qa*:refs/remotes/origin/qa*
  

但是,您可以使用命名空间(或目录)来完成类似的操作
  如果您有一个质量检查团队可以推动一系列分支,并且希望获得master分支和任何质量检查团队的分支,但别无其他,则可以使用如下配置部分:

[remote "origin"]
    url = https://github.com/schacon/simplegit-progit
    fetch = +refs/heads/master:refs/remotes/origin/master
    fetch = +refs/heads/qa/*:refs/remotes/origin/qa/*
  

如果您有一个复杂的工作流程,其中有一个质量检查团队负责推动分支机构,开发人员负责推动分支机构以及集成团队负责推动和协作远程分支机构,则可以通过这种方式轻松地为其命名空间。

此方法也适用于git push,带有remote.<name>.push条目。

这样,默认的git push只会推送所需的refspecs ... 只要排除的分支在单独的名称空间中。

这仍然是white list approach:对于每个名称空间,您都必须列出要推送的分支,而忽略不想要的一个名称空间。


工作示例:

cd /path/to/repos
git init example
echo test>afile
git add .
git commit -m "First commit in master"
git checkout -b private/abranch
echo abranch>>afile
git add .
git commit -m "First commit in a private branch"
git checkout master

cd ..
git init --bare example.git
cd example
git remote add origin ../example.git

git config remote.origin.push refs/heads/master:refs/remotes/origin/master

答案 1 :(得分:2)

最简单的方法是将push.default设置为matching

要推送的任何分支,请为它们赋予与上游存储库上的匹配分支相同的名称。您不想推送的任何分支,请为其命名,那里不存在。然后,您的推送只是简单的git push

如果您要使用上游分支的仅本地版本,请给它一个不匹配的名称,例如git checkout -b local/master origin/master

答案 2 :(得分:0)

一种解决方案是拥有一个专用的本地克隆,其中只有LocalTest

您可以从当前的本地克隆中获取push --all,其中包含所有分支。

  

有时我们想将其他分支(特别是他们的新commtis)合并到我们的本地分支,因此专用本地克隆没有好主意

这是一个好主意:您可以将第一个克隆添加为第二个克隆的遥控器(具有本地测试分支)。
这意味着您可以随时从第一个克隆中获取任何分支,并将它们合并到LocalTest分支。

或者,您可以尝试prevent one branch to be pushed(使用预推钩,但这会使全部推送失败 - 所有,这是不切实际的。