web-dev-qa-db-ja.com

Git:フェッチ専用リモートをセットアップしますか?

リモートが構成されているGitリポジトリの1つでgit remote -vを実行すると、各リモートにフェッチとプッシュの両方の仕様があることがわかります。

$ git remote -v
<remote-name> ssh://Host/path/to/repo (fetch)
<remote-name> ssh://Host/path/to/repo (Push)

ピア開発者を指すリモートの場合、プッシュする必要はありません。Gitは、とにかく非ベアリポジトリへのプッシュを拒否します。これらのリモートをプッシュアドレスや機能を持たない「フェッチ専用」として設定する方法はありますか?

111
mtbkrdave

削除プッシュURLではなく、オーバーライドプルURL以外のものにできるとは思いません。だから私はあなたが得る最も近いものはこのようなものだと思う:

$ git remote set-url --Push Origin no-pushing
$ git Push
fatal: 'no-pushing' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

プッシュURLをno-pushingに設定しています。作業ディレクトリに同じ名前のフォルダーがない限り、gitは検索できません。基本的に、存在しない場所を使用するようにgitに強制します。

163
Daniel Brockman

プッシュURLを無効なもの(たとえば、git remote set-url --Push Origin DISABLED)に変更する以外に、pre-Pushフックを使用することもできます。

git Pushを停止する簡単な方法の1つは、/usr/bin/falseをシンボリックリンクにしてフックにすることです。

$ ln -s /usr/bin/false .git/hooks/pre-Push
$ git Push
error: failed to Push some refs to '...'

フックを使用すると、必要に応じて、プッシュをより詳細に制御できます。進行中のコミットのプッシュを防ぐ方法の例については、.git/hooks/pre-Push.sampleを参照してください。

8

一般的なステートメント「Gitは非ベアリポジトリへのプッシュを拒否します」は正しくありません。 Gitは、リモートリポジトリのチェックアウトされた作業ディレクトリと同じブランチにある変更をプッシュしようとする場合にのみ、非ベアリモートリポジトリへのプッシュを拒否します。

この答えは簡単な説明を与えます: https://stackoverflow.com/a/2933656/1866402

(コメントを追加するのに十分な評判がないため、これを回答として追加しています)

4
pkeller

リポジトリを制御できる場合は、権限を利用してこれを実現できます。リポジトリを取得するユーザーには、マスターリポジトリへの書き込み権限を付与しないでください。

0
Abhilash