我和我的同事正在OpenShift上做同一个项目。我们有几个必须在服务器上的分支,所以我们使用命令push --all
,我们每个人(我和我的队友)都希望有一个本地分支(称为LocalTest
)用于我们的本地测试和开发,所以问题是当我们使用push --all
时,原始分支是为包括LocalTest
在内的所有分支创建的。
顺便说一句,我忘了指出,有时我们需要合并其他分支到我们的本地分支,特别是在从服务器上拉取新提交之后,并且还想从我们的本地分支中挑选甚至合并(很少)到其他分支,这些分支将被推送到服务器上。
在git中有没有类似git push --all except branch-name
的命令,对于我们的问题,最好的解决方案是什么?
4条答案
按热度按时间nbewdwxp1#
最简单的方法是将
push.default
设置为matching
。任何你想推送的分支,都要给它们起一个和上游仓库中匹配的分支一样的名字。任何你不想推送的分支,给它们起一个不存在的名字。那么你的推送就只是一个裸
git push
。如果你想在一个上游分支的本地版本上工作,只需要给予它一个不匹配的名字,例如。
git checkout -b local/master origin/master
jaxagkaj2#
git push --all except master
也将是一个良好的开端问题是:REFSPEC模式非常有限。
refspec documentation很清楚:
你不能在模式中使用不完整的globs,所以这将是无效的:
但是,您可以使用命名空间(或目录)来完成类似的操作。
如果你有一个QA团队推送了一系列分支,你想得到
master
分支和QA团队的任何分支,但不想得到其他分支,你可以使用如下配置部分:如果您有一个复杂的工作流流程,其中QA团队推动分支,开发人员推动分支,集成团队推动远程分支并在远程分支上进行协作,那么您可以通过这种方式轻松命名它们。
这种方法也适用于
git push
,具有remote.<name>.push
条目。这样,默认的
git push
将只推送所需的refspecs…只要排除的分支在一个单独的名字空间中。这仍然是一个white list approach:你必须为每个名称空间列出你想要推送的分支,并忽略你不想要的名称空间。
工作示例:
q5iwbnjs3#
一种解决方案是拥有一个专用的本地克隆,其中只有
LocalTest
。您可以从当前的本地克隆中创建
push --all
,您在本地克隆中拥有所有分支。有时我们想合并其他分支(特别是他们的新commtis)到我们的本地分支,所以没有一个好主意是专门的本地克隆
这是一个好主意:你可以添加你的第一个克隆作为你的第二个克隆的远程(它有本地测试分支)。
这意味着您可以随时从第一个克隆中获取任何分支,并将它们合并到
LocalTest
分支。或者,您可以尝试prevent one branch to be pushed(使用pre-push钩子,但这将使allpush--all失败,这是不实际的。
ymzxtsji4#
你总是可以想出最适合你的方法。你可以在git bash中使用这个一行程序。
例如,当我想推送除master分支以外的所有分支时,我使用此命令。
您可以根据需要添加任意数量的管道
sed
命令应用程序。$(... | sed 's/<your_branch_name>// ...)
。该命令的工作方式如下:
git branch
列出所有本地分支,包括master和当前分支旁边的“*”字符。echo
再次输出输出。首先sed
删除*
字符,然后我使用sed
将其他分支名称替换为空字符串。该命令的输出将是所有分支的列表,但已删除的分支除外。这是通过$(...)
语法作为参数传递给git push origin
的。