由于 git 中有多种默认分支选择,我如何编写一个引用默认分支(无论名称如何)的脚本/别名?
我的具体示例是我的别名,它重新定位到最新的远程主控:
### version for `master`
# rebaseOn = "!f() { BRANCH=$(git symbolic-ref --short HEAD) && git fetch && git pull --rebase; git rebase origin/${1:-master}; }; f"
### version for `main`
rebaseOn = "!f() { BRANCH=$(git symbolic-ref --short HEAD) && git fetch && git pull --rebase; git rebase origin/${1:-main}; }; f"
Run Code Online (Sandbox Code Playgroud)
用法:git rebaseOn或git rebaseOn newParentBranch(因为它默认输入${1:-main})
我希望该命令适用于那里的任一版本,因为我使用的各种存储库都有main或master或default或trunk
到目前为止,我已经找到了/sf/answers/3503969731/:git remote show upstream | grep "HEAD branch" | sed 's/.*: //'但这对于插入别名来说相当长。
还有比这更好的选择吗?
迄今为止最佳答案
用我自己的话重申当前的最佳答案:
@matt建议使用git branch --set-upstream-to:
git branch --set-upstream-to <main/master>在最初克隆存储库时进行了设置,并且在运行该命令时与您接触的每个存储库保持一致default,您必须pull选择名称(编写此脚本),以便在变基之前包含任何新的提交
default您实际上无法使用此方法做到这一点,总是需要一个单独的分支来处理尚未准备好推送的提交default并推送,无需额外工作合并的效果可能会更好一些(就像 git 的情况一样)
注意:真正令人沮丧的是,当一个仓库同时具有 amaster和main分支时,很难通过 CLI 记住/知道/发现哪个是主要的(必须git log查看日期,记住相当晦涩的命令,或者检查 github。所有这些都需要超过 2 秒并且上下文发生变化,以了解挫败感的程度)
jto*_*mpl 22
继续伟大的@torek的评论,你可以这样设置你的别名:
main-branch = !git symbolic-ref refs/remotes/origin/HEAD | cut -d'/' -f4
remotesh = remote set-head origin --auto
com = "!f(){ git checkout $(git main-branch) $@;}; f"
upm = "!f(){ git pull --rebase --autostash origin $(git main-branch) $@;}; f"
rebasem = "!f(){ git rebase -i --autosquash origin/$(git main-branch) --no-verify $@;}; f"
Run Code Online (Sandbox Code Playgroud)
git main-branch将返回当前“主”分支的名称(主/主)。
在其他别名中使用$(git main-branch)而不是硬编码的master分支名称。请记住,它需要是一个 shell 脚本(以 开头!),以便$(git main-branch)实际进行插值。
如果任何别名出现错误fatal: ref refs/remotes/origin/HEAD is not a symbolic ref,则只需运行即可git remotesh。
您在这里有很多选择。但是,我建议您不要使用我在这里列出的任何一个,因为您的分支名称是您的。您没有理由需要使用与其他存储库相同的名称。这也是马特在评论中建议的。
\n不过,您的选择包括:
\n在您自己的存储库中阅读origin/HEAD。
repo-A$ git symbolic-ref refs/remotes/origin/HEAD\nrefs/remotes/origin/master\n\nrepo-B$ git symbolic-ref refs/remotes/origin/HEAD\nrefs/remotes/origin/main\nRun Code Online (Sandbox Code Playgroud)\n例如,其中 repo-A 是使用 的旧存储库的克隆,master而 repo-B 是使用 的较新存储库的克隆。main
请注意,您有时可能需要运行git remote set-head --auto让您的 Git 注意到其Git 已重命名master为main,因此更新您的origin/HEADGit 以匹配。您的origin/HEAD值是在您运行时建立的git clone,之后不会更新,除非您使用git remote set-head --auto. 您当然可以将此git remote set-head操作放入您的别名中。
使用git remote show,就像你展示的那样。它在一个别名中:为什么你关心别名有多长?
使用上游设置(git branch --set-upstream-to)然后运行git rebase,即可选择当前分支的上游。当然,这主要是针对分支;据推测,当您想在强制推送之前更新名为over on 的分支时,您正在使用此别名。如果是这样,那么这个选项就是一个糟糕的选项。origin/namenamenamenameorigin
写一个脚本。将脚本放在您的某个地方,例如$PATH命名它。git-rebase-on-default-branch运行git rebase-on-default-branch将运行您的脚本。现在它不是一个别名,而是一个脚本\xe2\x80\x94,无论你喜欢什么语言\xe2\x80\x94,你都可以在其中放入任意数量的代码,使其变得如你所愿的聪明和花哨。(我明白了,这也是\xc3\x94rel\ 的建议。)
毫无疑问还有更多,但这至少应该涵盖一些基础。
\n| 归档时间: |
|
| 查看次数: |
5187 次 |
| 最近记录: |