2010-09-23 4 views
0

Je veux appliquer (ie lancer une erreur et échouer) que chaque fois que je fais une fusion git je n'ai pas de changements non-statiques, beaucoup dans le même sens qu'un git-rebase ne sera pas fonctionne si des changements non-planifiés existent. Y a-t-il un moyen de faire cela?Imposer une fusion sans modification de git

+0

Ce n'est pas comme ça que ça fonctionne. Vous êtes autorisé à avoir votre copie de travail dans n'importe quelle condition et encore commettre. Si vous rencontrez des problèmes avec des devs ignorants qui commettent des fusions cassées, ajoutez un hook pré-commit qui teste la construction et refusera de commettre si la construction échoue. – Daenyth

+0

Le but de ceci n'a rien à voir avec si la construction brise, mais qu'il est difficile de retourner une fusion qui a des commits entrelacés. – NorthIsUp

+0

Je réalise que j'ai formulé ma question avec un vocabulaire totalement incorrect, voir la bonne question ici: http://stackoverflow.com/questions/3807811/enforce-no-merging-while-staged-changes-exist-in-git – NorthIsUp

Répondre

3

Ce n'est pas joli, mais ça marche. Je serais intéressé de voir une meilleure solution.

Git rejette déjà la fusion si le fichier à fusionner est sale:

 
    $ git init 
    Initialized empty Git repository in /tmp/mmm/.git/ 
    $ echo this is file1 > file1 
    $ git add file1 
    $ git ci -m'first commit' file1 
    [master (root-commit) efd89a6] first commit 
    1 files changed, 1 insertions(+), 0 deletions(-) 
    create mode 100644 file1 
    $ git co -b branch1 
    Switched to a new branch 'branch1' 
    $ echo change file1 >> file1 
    $ git ci -m'change on a branch' file1 
    [branch1 031e317] change on a branch 
    1 files changed, 1 insertions(+), 0 deletions(-) 
    $ git co master 
    Switched to branch 'master' 
    $ echo change on master >> file1 
    $ git merge branch1 
    Updating efd89a6..031e317 
    error: Your local changes to 'file1' would be overwritten by merge. Aborting. 
    Please, commit your changes or stash them before you can merge. 

Reprenons l'exemple:

 
    $ git ci -m'commit change on master' file1 
    [master 8a2d52c] commit change on master 
    1 files changed, 1 insertions(+), 0 deletions(-) 
    $ git merge branch1 
    Auto-merging file1 
    CONFLICT (content): Merge conflict in file1 
    Automatic merge failed; fix conflicts and then commit the result. 
    $ vi file1 
    $ git add file1 
    $ git ci 
    [master ee16606] Merge branch 'branch1' 
    $ git log --oneline 
    ee16606 Merge branch 'branch1' 
    8a2d52c commit change on master 
    031e317 change on a branch 
    efd89a6 first commit 
    $ echo this is file2 > file2 
    $ git add file2 
    $ git co -b branch2 
    A  file2 
    Switched to a new branch 'branch2' 
    $ echo change on branch2 >> file2 
    $ git ci -m'commit on branch2' file2 
    [branch2 06ff9c3] commit on branch2 
    1 files changed, 2 insertions(+), 0 deletions(-) 
    create mode 100644 file2 
    $ git co master 
    Switched to branch 'master' 
    $ echo this change logically conflicts with the change to file2 on branch2 >> file1 

Il est la commande suivante que vous voulez forcer un échec - vous voulez éviter cette fusion lorsque votre arbre est sale. Vous pouvez le faire dans le hook prepare-commit-msg, mais seulement si vous faites --no-ff fusionne, et ne laissez pas la fusion commettre automatiquement. Voici un aperçu du crochet:

#!/bin/sh 
case "$2,$3" in 
    merge,) 
    echo "Check here if the working tree is dirty. If it is, fail." 
    exit 1 
    ;; 
    *) ;; 
esac 

Vous devez utiliser --no-ff et --no-commit, sur toutes les branches que vous seriez fusionnez dans et que vous voulez protéger des fusions comme celle-ci:

 
    git config branch.master.mergeoptions "--no-commit --no-ff" 

Et voici ce que la séance ressemblerait à ceci:

et défaisant à l'état pré-fusion:

 
    $ git reset --merge 
    $ git status 
    # On branch master 
    # Changed but not updated: 
    # (use "git add ..." to update what will be committed) 
    # (use "git checkout -- ..." to discard changes in working directory) 
    # 
    #  modified: file1 
    # 
    no changes added to commit (use "git add" and/or "git commit -a")