我使用Git "Integration-Manager" workflow,同时使用gitolite进行权限管理。 Gitolite有这个简洁的选项,可以轻松管理personal user branches:
refs/personal/USERNAME/USERBRANCHNAME
在我们的例子中,这些是开发人员具有写访问权限的唯一分支。这意味着他们经常从“受祝福”的存储库中取出,这是“origin”遥控器上的“主”分支,如下所示:
$ git pull origin master
然而,他们需要经常将他们的工作推回到他们的个人分支,如下:
$ git push origin master:refs/personal/mysuername/mybranchname
键入那些长分支名称变得陈旧,非常快,特别是对于集成商而言,他必须经常从各种长分支名称中提取。大多数人都希望输入更简单的内容,例如:
$ git push origin master:mybranchname
所以,我的问题是,“如何通过缩短名称和减少错别字来使这更容易?”有没有办法为用户的远程分支创建别名或快捷方式?我们的集成商希望能够为每个开发人员创建别名,以简化其命令。
此外,是否可以将git配置为始终从一个分支拉出并推送到另一个分支,而无需在两种情况下都指定远程和分支名称?这对我们的开发人员有帮助,尽管它对我们的集成商没有帮助。 ...我熟悉configuring a single default to push and pull from the same remote and branch,但在这种情况下不起作用,因为推拉分支是不同的。
谢谢!
答案 0 :(得分:4)
是。只需使用其他名称跟踪分支即可。请参阅git branch的手册页和诸如--set-upstream。
之类的内容希望这有帮助。
答案 1 :(得分:1)
注意:以下忽略了gitolite,因为我不知道它是如何工作的。
每个开发人员都可以跟踪他们自己的个人分支,而不是跟踪主分支。当他们想要更新时,他们可以从主服务器合并它们。 (听起来你的当前设置恰恰相反:每个人都跟踪主人并且正在手动推动。)
另外,不要忘记标签的完成情况。对于使用bash的Ubuntu,键入git push origin o<TAB>
将完成origin/
,然后另一个 Tab 将显示可用分支列表。
如果您的集成商已将结果签出到~/prj
:
integrator:~/prj$ git push origin master:trevor-personal
integrator:~/prj$ git push origin master:pydave-personal
每个开发人员都可以使用他们的个人分支进行克隆。
trevor:~$ git clone /path/to/master/repo.git -b trevor-personal prj
pydave:~$ git clone /path/to/master/repo.git -b pydave-personal prj
或者他们可以检查现有克隆中的新分支,该分支跟踪其原始个人分支。
pydave:~/prj$ git checkout -b personal origin/pydave-personal
或者,如果我们想使用现有分支,我们可以使用set-upstream。
pydave:~/prj$ git branch --set-upstream personal origin/pydave-personal
将更改发布到开发人员分支。
trevor:~/prj$ git commit -am'changed something'
trevor:~/prj$ git push
合并它。
integrator:~/prj$ git pull
integrator:~/prj$ git push origin origin/trevor-personal:master
从主分支中检索更改。 (我们必须具体说明使用origin的主人。git pull
只会合并pydave-personal
中的更改
pydave:~/prj$ git pull origin master
答案 2 :(得分:1)
感谢大家的意见和建议。以下是我让开发人员和集成商使用裸git push
和git pull
的方式:
在最简单的集成管理器工作流中,如上所述,开发人员克隆了(git clone
)并因此自动跟踪其本地主分支中的远程主分支,因此她所需要的只是:
git pull
更新她的本地主分支。如果她在其他分支机构工作,那么她可以像Adam建议的那样更新正在跟踪的上游分支:
git branch --set-upstream MYOLDBRANCH origin/master
# or, use longer, more explicit syntax, like:
git branch --set-upstream MYOLDBRANCH refs/remotes/origin/master
默认情况下,将拉出被跟踪的分支(在本例中为origin / master)。
由于默认推送目标是不同的分支而不是同一个名称,我们无法利用push.default:跟踪,当前或匹配。相反,我们的开发人员必须设置默认源:目标refspec,用于所有推送到.git / config文件中的给定远程,如下所示:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = GITREPOHOSTNAME:REPONAME
push = master:refs/personal/MYDEVNAME/MYBRANCHNAME
她也可以创建一个别名,如下所示:
git config alias.pushToMyBr 'push origin master:refs/personal/MYDEVNAME/MYBRANCHNAME
别名非常强大,并提供了避免击键的最大灵活性。 :-)上述情况可以通过简单的执行:
git pushToMyBr
在这种简单的情况下,积分器通常会推到一个地方,原点/主人。如果将push.default设置为匹配,跟踪或当前,那么裸推将起作用,如下所示:
git config push.default current
git checkout master
git push
各种个人开发者分支的频繁拉动是更困难的情况。集成商可以使用别名来简化任务,如下所示:
git config alias.pullFromXY 'pull origin refs/personal/DEVNAMEX/BRANCHNAMEY:master
# or, pull to a specific topic branch
git config alias.pullFromABtoC 'pull origin refs/personal/DEVNAMEA/BRANCHNAMEB:branchC'
集成商还可以创建分支来跟踪开发人员的个人远程分支,如下所示:
git checkout -b test_devXbranchY origin/personal/DEVNAMEX/BRANCHNAMEY
# or, use a more specific syntax:
git checkout -b test_devXbranchY refs/remotes/origin/personal/DEVNAMEX/BRANCHNAMEY
为此,集成商必须将个人分支添加到她的获取列表中。这可以通过直接编辑她的.git / config来完成,如下所示:(我不知道如何使用git-config或任何其他git命令执行此操作。)
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = MYGITHOSTNAME:MYREPONAME
fetch = +refs/personal/*:refs/remotes/origin/personal/*
# Fetch a specific developer's branches:
fetch = +refs/personal/devX/*:refs/remotes/origin/personal/devX/*
感谢大家的帮助!希望这能帮助在头顶空间之外使用gitolite和个人分支的其他人。
谢谢!
特雷弗