2012-07-16 14 views

答えて

4

を参照してください。

そして、すべてのブランチの履歴変更をブロックする必要がある場合は、git config --system receive.denyNonFastForwards trueは単にジョブを実行します。

+0

denyNonFastForwards is notあなたが使うはずの「解決」。力のプッシュを拒否するgitフックを設定...これはこれを行う正しい方法です。 – Eric

+0

@Eric非早送りプッシュを拒否するのは、実際にはGitHub/BitBucketに進む方法です。新しい自転車は発明されていません。 –

+0

すべてのブランチですべての非高速転送を拒否した場合、どのように機能ブランチをマージしますか? – Eric

1

This SO answerあなたが探しているものを提供します。ただ、代わりに、masterブランチに適用することを編集:

#!/bin/sh 
# lock the master branch for pushing 
refname="$1" 

if [ "$refname" = "refs/heads/master" ] 
then 
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
    echo "You cannot push to the master branch." 
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
    exit 1 
fi 
exit 0 

更新:
これは、すべてが早送りなどのマスターブランチにプッシュしなくなります。

+4

これにより、選択したブランチへのプッシュが防止されます。早送りを許可する必要があります。 –

+0

[ここで、誰かが更新スクリプトの強制的な状態を検出する方法を見つけました。](http://stackoverflow.com/a/12258773/444255)長い説明、最後のスニペットはまだ完了する必要があります... –

1

あなたはdenyNonFastForwards

git config --system receive.denyNonFastForwards true 

を設定することにより、非早送り更新を防ぐことができます。しかし、それはすべての支店に適用されます。詳細情報については は、あなたが非早送りがきめ細かなアクセス許可を使用してプッシュブロックするようにセットアップごとのブランチ権限(管理者)にGitEnterpriseを使用することができますProGit

0

私はそれがあなたのリポジトリにアクセスするためにサーバー側で何を使用するかによって異なると思います。 GerritまたはGitlabのようなブランチごとのアクセス許可をサポートするサーバーアプリケーションがいくつかあります(ただし、Gitlabがユースケースをサポートしているかどうかはわかりません)。 Gerritは私の会社で同様のワークフローを使用しているので、これをサポートしています。

Gitoliteはこれをサポートしています(これはGitlabが使用するものです)。設定が簡単ですが、GerritやGitlabのようなWebインターフェイスはありません。

その他のコメント:GitEnterpriseは、お勧めのように、良い解決策でもありますが、自分のサーバー(多くの企業で共通)があれば、私の提案は適しています。

5

私は自分自身で使用するための更新フック(コピーからフックへのコピー)です。このスクリプトはデフォルトですべての非高速フォワード更新を拒否しますが、明示的に設定されたブランチに対して許可します。マスターブランチ以外のすべてのものに対して、早送りではない更新が許可されるように、反転するのは簡単です。

#!/bin/sh 
# 
# A hook script to block non-fast-forward updates for branches that haven't 
# been explicitly configured to allow it. Based on update.sample. 
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new 
# 
# Config 
# ------ 
# hooks.branch.<name>.allownonfastforward 
# This boolean sets whether non-fast-forward updates will be allowed for 
# branch <name>. By default they won't be. 

# --- Command line 
refname="$1" 
oldrev="$2" 
newrev="$3" 

# --- Safety check 
if [ -z "$GIT_DIR" ]; then 
     echo "Don't run this script from the command line." >&2 
     echo " (if you want, you could supply GIT_DIR then run" >&2 
     echo " $0 <ref> <oldrev> <newrev>)" >&2 
     exit 1 
fi 

if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then 
     echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 
     exit 1 
fi 

# --- Check types 
# if $newrev is 0000...0000, it's a commit to delete a ref. 
zero="0000000000000000000000000000000000000000" 
if [ "$newrev" = "$zero" ]; then 
     newrev_type=delete 
else 
     newrev_type=$(git cat-file -t $newrev) 
fi 

case "$refname","$newrev_type" in 
     refs/tags/*,commit) 
       # un-annotated tag 
       ;; 
     refs/tags/*,delete) 
       # delete tag 
       ;; 
     refs/tags/*,tag) 
       # annotated tag 
       ;; 
     refs/heads/*,commit) 
       # branch 
       # git rev-list doesn't print anything on fast-forward updates 
       if test $(git rev-list "$newrev".."$oldrev"); then 
         branch=${refname##refs/heads/} 
         nonfastforwardallowed=$(git config --bool hooks.branch."$branch".allownonfastforward) 

         if [ "$nonfastforwardallowed" != "true" ]; then 
           echo "hooks/update: Non-fast-forward updates are not allowed for branch $branch" 
           exit 1 
         fi 
       fi 
       ;; 
     refs/heads/*,delete) 
       # delete branch 
       ;; 
     refs/remotes/*,commit) 
       # tracking branch 
       ;; 
     refs/remotes/*,delete) 
       # delete tracking branch 
       ;; 
     *) 
       # Anything else (is there anything else?) 
       echo "hooks/update: Unknown type of update to ref $refname of type $newrev_type" >&2 
       exit 1 
       ;; 
esac 

# --- Finished 
exit 0 
+1

スクリプトを修正して、マスターブランチ以外のすべてに対して高速でないフォワード更新が許可されるようにすると便利です – Ren

0

サーバーを変更することが許可されている場合は、サーバー上での早送りが有効になります。

ssh ip 'echo $"[receive] 
    denyDeletes = false 
    denyNonFastForwards = false" >> /path/to/repo/config' 
#then git push -f origin master 
関連する問題