签出合并请求分支而不添加远程



我喜欢GitHub上名为Hub的工具,但我不能在公司的GitLab服务器上使用它。GitLab 的解决方案是在我想签出合并请求分支以供审查时提供以下说明:

第 1 步。获取并签出此合并请求的分支

git fetch ssh://gitlab.myserver.com:29418/username/repo.git branch_name
git checkout -b username/branch_name FETCH_HEAD

这对于签出分支很好,但在我想获取更新时没有用(我必须删除分支并再次运行此命令。我真正想要的是一个命令,可以像这样将其添加到我的存储库.git/config中:

[branch "branch_name"]
remote = ssh://gitlab.myserver.com:29418/username/repo.git
merge = refs/heads/branch_name

如果我手动输入,一切都很棒,我可以在更新时尽情git pull,但我无法弄清楚第一次输入的命令以避免不得不返回并手动编辑我的.git/config

在您建议之前,是的,我知道我可以添加远程username/repo,但是我的团队中有很多人,当我执行以下操作时,我不想让他们的所有分支弄乱我的本地存储库:

git fetch --all --prune
git log --graph --all --decorate --abbrev-commit --pretty=format:'%C(yellow)%h %Cred%cd %Cblue%an%C(auto)%d %Creset%s' --date=short

最终,您的手动解决方案是添加两个配置值;您可以使用git config命令执行此操作,而不是直接编辑文件。 我知道这不是你的意思,但这可能是一种更容易编写脚本的方式来看待你正在做的事情。(特别是考虑到您可能只有一个远程 URL;或者,如果不是 1 个,则足够少,如果需要,您可以为每个 URL 创建一个别名。

另一种看待这一点的方法是,git 支持频繁访问给定 URL 的存储库是添加远程。 您拒绝了这一点,因为它会在log--all参数(以及类似参数)的定义中包含远程跟踪引用;但相反,您可以重新考虑您使用的参数。 例如,如果您将 gitlab 添加为名为gitlab的远程,则可以

git log --exclude=refs/remotes/gitlab/* --all

或者你可能会发现--branches--tags--glob等的某种组合可能比首先使用--all更能满足你的需求。

我建议在花费太多精力试图避免使用远程机制之前考虑这些选项。

所以我想出了一个解决方案,它利用 GitLab 将 PR 的源分支镜像到merge-requests/<number>/head下的目标存储库中的事实。这不是我最喜欢的解决方案,因为我过去曾遇到过镜像与原始分支不同步很长时间的问题,但这就是我现在所拥有的一切。

mr = "!f() { 
git fetch $1 merge-requests/$2/head:mr-$1-$2 && 
git checkout mr-$1-$2 && 
git config --add branch.mr-$1-$2.remote $1 && 
git config --add branch.mr-$1-$2.merge mr-$1-$2; 
}; 
f"

我仍然有兴趣听到其他解决方案,特别是如果它可以与原始源分支一起使用。

最新更新