4

我在 Git 中使用“Integration-Manager”工作流程,同时使用 gitolite 进行权限管理。Gitolite 有这个简洁的选项,可以轻松管理个人用户分支

refs/personal/USERNAME/USERBRANCHNAME

在我们的例子中,这些是开发人员拥有写入权限的唯一分支。这意味着他们经常从“blessed”存储库中提取,这是“origin”远程上的“master”分支,如下所示:

$ git pull origin master

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

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

键入那些长分支名称会变得非常老旧,非常快,尤其是对于必须定期从各种长分支名称中提取的集成商而言。大多数人想输入一些更简单的东西,比如:

$ git push origin master:mybranchname

所以,我的问题是,“我如何通过更短的名称和减少拼写错误来使这更容易?” 有没有办法为用户的远程分支创建别名或快捷方式?我们的集成商希望能够为每个开发人员创建别名,以简化她的命令。

此外,是否可以将 git 配置为始终从一个分支拉出并推送到另一个分支,而无需在两种情况下都指定远程和分支名称?这将帮助我们的开发人员,尽管它不会帮助我们的集成商。...我熟悉配置单个默认值以从同一个远程和分支推送和拉取,但这在这种情况下不起作用,因为推送和拉取分支是不同的。

谢谢!

4

3 回答 3

4

是的。只需使用不同名称之一跟踪分支。请参阅 git branch 的手册页和 --set-upstream 之类的内容。

希望这可以帮助。

于 2011-09-08T23:39:07.813 回答
1

注意:以下忽略 gitolite,因为我不知道它是如何工作的。

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

另外,不要忘记制表符补全。对于在 Ubuntu 上使用 bash 的我来说,输入git push origin o<TAB>将完成origin/,然后另一个Tab将显示可用分支的列表。


创建个人分支

如果您的集成商已将 repo 签入~/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

从主分支检索更改。(我们必须具体说明使用原点的主人。git pull只会合并更改pydave-personal

pydave:~/prj$ git pull origin master
于 2011-09-09T01:51:13.773 回答
1

感谢大家的意见和建议。以下是我如何让我的开发人员和集成人员使用 bare git pushand git pull

对于开发人员

如上所述,在最简单的集成管理器工作流程中,开发人员已克隆 ( git clone),因此会自动跟踪其本地 master 分支中的远程 master 分支,因此她只需要:

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 的优势:跟踪、当前或匹配。相反,我们的开发人员必须在她的 .git/config 文件中为所有推送到给定远程设置默认的 source:destination 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 设置为匹配、跟踪或当前,那么裸推送将起作用,如下所示:

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

谢谢!

特雷弗

于 2011-09-17T22:04:39.147 回答