在Git和Gitolite中处理较长的个人分支名称

4

我正在使用 Git 和 "Integration-Manager" 工作流程,同时使用 gitolite 进行权限管理。Gitolite 有一个很棒的选项,可以轻松地管理 个人用户分支

refs/personal/USERNAME/USERBRANCHNAME

在我们的情况下,这些是开发人员拥有写入访问权限的唯一分支。这意味着他们通常从“受祝福”的存储库中拉取,这是“起源”远程上的“主”分支,如下所示:
$ git pull origin master

然而,他们需要定期将自己的工作推回到个人分支中,如下所示:

$ git push origin master:refs/personal/mysuername/mybranchname

打那些冗长的分支名称真的很烦人,特别是对于集成者来说,他们必须经常从各种冗长的分支中拉取。大多数人想要输入更简单的内容,比如:
$ git push origin master:mybranchname

所以,我的问题是,“如何通过缩短名称和减少打字错误来使这更容易?”是否有一种方法为用户的远程分支创建别名或快捷方式?我们的集成者希望能够为每个开发人员创建别名以简化她的命令。
此外,是否可以配置git始终从一个分支拉取并推送到不同的分支,而无需在两种情况下指定远程和分支名称?这将有助于我们的开发人员,尽管这并不会帮助我们的集成者。我熟悉配置单个默认值以从同一远程和分支推送和拉取, 但在这种情况下不起作用,因为推送和拉取分支是不同的。
谢谢!

2
请尽量一次只提出一个问题。 - svick
3个回答

4
是的,只需使用不同名称跟踪分支。请参阅git branch手册页面和--set-upstream等内容。
希望这可以帮助您。

完全正确。Git有一个叫做追踪(tracking)的功能。本地分支名称不必与远程分支相匹配,您可以设置本地分支追踪origin/master,然后只需使用git push命令即可完成操作。 - user229044
但是,这条路需要常规的“拉”源和“推”目标相同吗?我们的用户将定期从一个分支拉取并推送到另一个分支。谢谢!也许我误解了? - Trevor
抱歉我有点笨,但是我已经多次阅读了git branch, remote, clone和push的手册,但还是不明白。:(如果开发者进行克隆操作:git clone remote-host:repo-name其中,'master'是远程主分支,她可以通过以下方式获取未来的更新:git pull origin master 或者 git pull。这个我懂了。但是,她总是将自己的工作推送到git push origin master:refs/personal/USERNAME/USERBRANCHNAME。她需要做什么才能以后只需执行git push呢? - Trevor
添加 --set-upstream 参数。 - Adam Dymitruk

1

注意:以下内容忽略gitolite,因为我不知道它的工作原理。

每个开发人员可以跟踪自己的个人分支,而不是跟踪主分支。当他们想要更新时,可以从主分支合并更新。(听起来你目前的设置是相反的:每个人都跟踪主分支并手动推送。)

此外,不要忘记使用制表符自动补全功能。对于我在Ubuntu上使用bash,输入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

感谢您提供详细的建议!顺便说一下,gitolite使用ssh。尝试将您的建议应用到我的情况中,如果我的集成器为开发人员推送“blessed”分支,如下所示:git push origin master:refs/personal/DEVELOPER/FROM_INTEGRATOR,这似乎会在远程repo上创建一个新分支。然而,开发人员无法克隆它:git clone remote-host:repo-name -b refs/personal/DEVELOPER/FROM_INTEGRATOR,产生以下结果:cloning into repo-name ... warning: Remote branch refs/personal/DEVELOPER/FROM_INTEGRATOR not found in upstream origin, using HEAD instead。??? - Trevor

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为:tracking、current或matching。相反,我们的开发人员必须在她的.git/config文件中为所有推送设置默认源:目标refspec到给定的远程,例如:

[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

给集成者

在这种简单的情况下,集成者通常会推送到一个地方,即 origin/master。如果 push.default 设置为 matching、tracking 或 current,则裸推送将起作用,如下所示:

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和个人分支的人。

谢谢!

Trevor


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接