2

制御されたgitリポジトリの一部のリモートブランチに読み取り専用アクセスを構成する必要があります。

シナリオは次のとおりです。

私たちの開発では、「外部リポジトリ」を反映した内部「開発リポジトリ」 (1)があります。この「開発リポジトリ」はgit remote update、 (cronジョブ内で)定期的に更新されます。私たちの開発は、外部リポジトリから派生したブランチ「dev_ *」で行われますが、外部ブランチに直接向かうことはありません。

リポジトリスキーマ

機能を追加するためのワークフローmaster

  1. 親としてブランチを作成しますdev_mastermaster
  2. Johnはリポジトリのクローンを作成しdevelopment、チェックアウトしてdev_master作業し、定期的ににプッシュバックしdevelopmentます。
  3. リポジトリexternalmaster更新された場合はmasterdevelopment(上記のcronjobのために)であり、誰かがでマージできるmasterためdev_master、との同期を維持しexternalます。

のブランチへのジョンのプッシュを禁止する必要があるmasterためdevelopment、からの定期的な更新後に彼の変更が失われることはありませんexternal

繰り返しますが、回路図:

リポジトリの概要


ノート

(1)この開発リポジトリを「ステージングリポジトリ」と呼ぶ人がいることがわかりました(たとえば、非常によく似た状況が提示されているgitでステージングリポジトリを設定するにはどうすればよいですか? )

4

1 に答える 1

3

サーバーサイドフックを使用してこれらのプッシュを禁止します。差出人git help hooks

pre-receive
このフックは、リモートリポジトリのgit-receive-packによって呼び出されます。これは、ローカルリポジトリでgitプッシュが実行されたときに発生します。リモートリポジトリの参照の更新を開始する直前に、pre-receiveフックが呼び出されます。その終了ステータスによって、更新の成功または失敗が決まります。
[...]
フックがゼロ以外のステータスで終了した場合、どの参照も更新されません。フックがゼロで終了する場合でも、更新フックによって個々の参照の更新を防ぐことができます。
[...]

フックコード:

#!/bin/bash

# Read the branches of the remote repository
remote_branches=$(git ls-remote --heads | sed "s,.*\(refs/heads/\),\1,")

function forbid_push_to_remote_branches()
{
    while read old_value new_value ref_name
    do
        # Test for existence of [$ref_name] in remote
        for remote_branch in $remote_branches
        do
            if [[ $remote_branch == $ref_name ]]
            then
                invalid_refs="$invalid_refs [$remote_branch]"
                break
            fi
        done
    done

    # if remote read-only branches found, exit with non-zero
    # and list these branches
    if [[ -n $invalid_refs ]]
    then
        echo "ERROR: You are trying to push to remote branch(es):" >&2
        echo "   $invalid_refs" >&2
        return 1 
    else
        return 0
    fi
}

forbid_push_to_remote_branches
exit $?

このコードはサーバー内のファイルにコピーする必要があり$(bare_repo_path.git)/hooks/pre-receiveます(ありませんpre-receive.sample)。

于 2013-01-24T13:11:17.083 に答える