git 推动除特殊分支以外的所有分支

46qrfjad  于 2023-05-15  发布在  Git
关注(0)|答案(4)|浏览(140)

我和我的同事正在OpenShift上做同一个项目。我们有几个必须在服务器上的分支,所以我们使用命令push --all,我们每个人(我和我的队友)都希望有一个本地分支(称为LocalTest)用于我们的本地测试和开发,所以问题是当我们使用push --all时,原始分支是为包括LocalTest在内的所有分支创建的。
顺便说一句,我忘了指出,有时我们需要合并其他分支到我们的本地分支,特别是在从服务器上拉取新提交之后,并且还想从我们的本地分支中挑选甚至合并(很少)到其他分支,这些分支将被推送到服务器上。
在git中有没有类似git push --all except branch-name的命令,对于我们的问题,最好的解决方案是什么?

nbewdwxp

nbewdwxp1#

最简单的方法是将push.default设置为matching
任何你想推送的分支,都要给它们起一个和上游仓库中匹配的分支一样的名字。任何你不想推送的分支,给它们起一个不存在的名字。那么你的推送就只是一个裸git push
如果你想在一个上游分支的本地版本上工作,只需要给予它一个不匹配的名字,例如。git checkout -b local/master origin/master

jaxagkaj

jaxagkaj2#

git push --all except master也将是一个良好的开端
问题是:REFSPEC模式非常有限。
refspec documentation很清楚:
你不能在模式中使用不完整的globs,所以这将是无效的:

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

但是,您可以使用命名空间(或目录)来完成类似的操作
如果你有一个QA团队推送了一系列分支,你想得到master分支和QA团队的任何分支,但不想得到其他分支,你可以使用如下配置部分:

[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/*

如果您有一个复杂的工作流流程,其中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
q5iwbnjs

q5iwbnjs3#

一种解决方案是拥有一个专用的本地克隆,其中只有LocalTest
您可以从当前的本地克隆中创建push --all,您在本地克隆中拥有所有分支。
有时我们想合并其他分支(特别是他们的新commtis)到我们的本地分支,所以没有一个好主意是专门的本地克隆
这是一个好主意:你可以添加你的第一个克隆作为你的第二个克隆的远程(它有本地测试分支)。
这意味着您可以随时从第一个克隆中获取任何分支,并将它们合并到LocalTest分支。
或者,您可以尝试prevent one branch to be pushed(使用pre-push钩子,但这将使allpush--all失败,这是不实际的。

ymzxtsji

ymzxtsji4#

你总是可以想出最适合你的方法。你可以在git bash中使用这个一行程序。

git push origin $(echo "$(git branch)" | sed 's/*//' | sed 's/<excluded_branch_name>//')

例如,当我想推送除master分支以外的所有分支时,我使用此命令。

git push origin $(echo "$(git branch)" | sed 's/*//' | sed 's/master//')

您可以根据需要添加任意数量的管道sed命令应用程序。$(... | sed 's/<your_branch_name>// ...)
该命令的工作方式如下:
git branch列出所有本地分支,包括master和当前分支旁边的“*”字符。echo再次输出输出。首先sed删除*字符,然后我使用sed将其他分支名称替换为空字符串。该命令的输出将是所有分支的列表,但已删除的分支除外。这是通过$(...)语法作为参数传递给git push origin的。

相关问题