【问题标题】:How to pragmatically check with bash script if a branch in git needs to be rebased?如果 git 中的分支需要重新定位,如何务实地检查 bash 脚本?
【发布时间】:2015-07-22 12:15:48
【问题描述】:

我正在为我的团队编写一个 bash 脚本,以强制对工作分支进行定期变基。我目前面临的问题是如何确定分支是否落后于 master 和/或是否需要重新设置分支,而不是盲目地尝试重新设置分支。

这是我目前所拥有的简化版本:

#Process each repo in the working directory.
for repo_dir in $(ls -1); do
    # if working branch is clean ...

        # BEGIN update of local master
        git checkout master
        git fetch origin
        git merge remotes/origin/master
        # END update of local master

        for sync_branch in $(git branch | cut -c 3-); do
            if [ "$sync_branch" != "master" ]; then
                # BEGIN rebase working branch
                git checkout $sync_branch
                git rebase master
                # Do NOT push working branch to remote.
                # END rebase working branch
            fi
        done
    fi
done

任何想法将不胜感激。谢谢!

【问题讨论】:

  • 我认为没有必要。 git rebase 应该检查并把自己变成一个空操作(“当前分支 是最新的。”)如果分支在其提交日志中有 master 的负责人。
  • @PSkocik 我想要这样做的原因不是git rebase 的自检能力。根据是否需要变基,我希望我的脚本执行其他操作。

标签: git bash rebase git-rebase git-bash


【解决方案1】:

要判断是否需要对分支进行变基,您需要找出最新的提交是什么,以及两个分支共享的最后一个提交是什么。

要查找分支上的最新提交:

git show-ref --heads -s <branch name>

然后找到你的分支共同的最后一次提交:

git merge-base <branch 1> <branch 2>

现在你需要做的就是找出这两个提交是否是同一个提交。如果他们是,那么你不需要变基。如果不是,则需要 rebase。

例子:

hash1=$(git show-ref --heads -s master)
hash2=$(git merge-base master foo/bar)
[ "${hash1}" = "${hash2}" ] && echo "OK" || echo "Rebase is required"

尽管如评论中所述,如果您尝试重新设置已经是最新的分支。 Git 会优雅地处理这种情况并退出。

【讨论】:

  • 当本地 master 与工作分支的最新提交处于相同提交级别时,这似乎有效。但是,当工作分支可能已经基于 master,但在 master 之前有几个提交时,它不会处理。有什么想法吗?
  • 你在哪个分支上做show-ref?应该是大师。基本上,这两个命令是检查 master 上的最新提交是否是工作分支的合并基础。工作分支上的提交根本不重要。
猜你喜欢
  • 2013-01-02
  • 2017-10-09
  • 2014-01-17
  • 2016-06-29
  • 1970-01-01
  • 2020-01-19
  • 2011-09-29
相关资源
最近更新 更多