在提取最新更改之前阻止用户执行提交

时间:2016-09-02 07:11:24

标签: git

让我说当我从develop创建一个功能分支f时,我有一个这样的提交树的本地存储库:

master --> a
            \
             \
      develop c 
               \
                \
         feature f

现在有一段时间新功能被合并以开发c,我的提交树看起来像这样:

 master --> a
             \
              \
       develop c --> d --> e
                \
                 \
          feature f

现在我想确保在从开发中提取最新更改之前我没有提交。

master --> a
            \
             \
      develop c --> d --> e
                           \ 
                            \ 
                     feature f

根据我的尝试,一种方法是将更改推送到f,然后尝试合并f以开发e(现在有新的更改)。这样做显然会从git中抛出错误消息,说发展在f之前。我非常有信心可以使用post-hook完成此操作。但是,我可以使用git pre-hook吗?

如果是这样,如何做,如果没有,请提出其他一些方法。如果可能的话请解释一下命令在做什么?(我只是git的初学者)

要求是在用户尝试执行此操作时显示一些自定义消息。

提前致谢!!

更新 我正在研究一个看起来像这样的解决方案(稍后这个脚本将在预提交钩子中调用)

tomato.sh

#!/bin/bash
WORKING_GIT_DIR=$1
cd $WORKING_GIT_DIR
# switch to BRANCH_TO_MERGE
BRANCH_TO_MERGE=$2
git checkout $BRANCH_TO_MERGE

PARENT_BRANCH=$(git show-branch | grep '*' | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//')
echo $PARENT_BRANCH
# in memory merging of feature branch and parent and look for possible conflicts
git merge-tree `git merge-base FETCH_HEAD $PARENT_BRANCH` FETCH_HEAD $PARENT_BRANCH

如何投放

sh +x tomato.sh (PATH TO WORKING_GIT_DIR) (BRANCH_TO_MERGE)

脚本如何运作

它试图找到父分支(详见[here] [2])。 然后使用以下方式进行三向合并:

git merge-tree <base> <branch1> <branch2>

base - &gt;找到当前FETCH_HEAD&amp;的最佳共同祖先。当前父分支的父/最近父分支
branch1 - &gt;当前FETCH_HEAD
branch2 - &gt;当前父分支的父/最近父分支

这将为远程和本地分支提供内存合并,而不实际更改索引。

如果有人改进了此脚本,请发表评论。

提前致谢!

2 个答案:

答案 0 :(得分:1)

  

现在我想确保在从开发中提取最新更改之前我没有提交。

这是不可能的,因为git中的提交是本地的

我认为你需要的是一个团队理解所有工作都是在推动之前重新开发。执行此操作将是代码审查。

可能是在CI中强制执行此操作的技术方法。

答案 1 :(得分:1)

正如已经指出的那样,普通的git对这样的事情没有任何特别的支持,这就是像pull request这样的概念被添加到git overlay解决方案(如github和bitbucket)以及像{{3}这样的工具的原因。促进组织政策的审查,访问等。

由于问题被标记为github,我假设您正在使用它,然后我会说您应该忽略本地功能分支的最新状态,并让开发人员推送他们分支的任何内容并创建拉取请求从那起。

如果功能分支落后,则拉出请求将显示,如果存在冲突 1 ,则无法合并。然后由功能分支开发人员离开球,并让他/她负责更新功能分支,以便将其合并到开发中。

1 这当然只能从自动逐行合并分析中确定,这可能无法检测到概念冲突。可以定义额外的gerrit,如果这是您想要的,我可以使用它来拒绝合并任何非最新的拉取请求。 更新:刚出现问题requirements