在git和gitolite中处理长的个人分支名称

时间:2011-09-08 23:18:09

标签: git version-control gitolite

我使用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,但在这种情况下不起作用,因为推拉分支是不同的。

谢谢!

3 个答案:

答案 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 pushgit 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和个人分支的其他人。

谢谢!

特雷弗