gitフックでリポジトリを操作するときの-Cと--git-dirの違い

ウィル・リチャードソン

デプロイの一部として別のリポジトリのクローンを作成するgitpost-receiveフックを作成しています。リポジトリを特定のフォルダに複製し、-C後続のgitコマンドのオプションを使用して、ディレクトリをチェックアウトされたリポジトリのディレクトリに設定します(マニュアルページに記載されています)。

フックは、コマンドラインから手動で実行すると期待どおりに機能しますが、フックをgitで実行すると(つまり、プッシュを受信すると)、コマンドはfatal: Not a git repository: '.'。で失敗します。私はスワップアウトするとき-Cのために--git-dirそれが動作します。

これは、複製、ベアリポジトリの作成、git init --bareおよびコンテンツを使用した実行可能フックの作成が非常に簡単です。

#!/bin/bash
set -xe

SOME_REPO_URL=???? # Some repo that is not this one
repopath=/tmp/somerepo

git clone $SOME_REPO_URL $repopath

# 1: This fails when run through the git hook
git -C $repopath checkout -b somebranch HEAD~1

# 2: This works every time
# git --git-dir $repopath/.git checkout -b somebranch HEAD~1

コマンドラインからスクリプトを実行すると期待どおりに機能しますが、リポジトリにプッシュするとフックは失敗します。コメント1とコメント解除2はどちらの場合でも機能します。

これが意図された動作であることを示すドキュメントが見つかりません。説明をいただければ幸いです。

これはUbuntu16.04のgit2.7.4です。

火曜日

間の文字通りの違い:

git -C directory git-sub-command ...

そして:

git --git-dir directory git-sub-command ...

フロントエンドセットアッププログラムgit、最初にOSレベルの「ディレクトリの変更」操作(os.chdirPython、chdir()Cなどから)を使用$GIT_DIRし、2番目に環境変数設定しますいずれの場合も、サブコマンドを見つけて実行します。(あなたが実際に行うことができます注両方を。)これが文書化され、複数の効果を含め、-Cオプションとの間の相互作用-C--git-dir

ただし、これは問題を1レベル下げるだけです。ここgit-checkoutで、(git --exec-pathディレクトリにある)$GIT_DIR現在の作業ディレクトリとは異なる動作をする必要があります直接の答えは、トップレベルのgitコマンドドキュメントの[環境変数]セクションにあります。

GIT_DIR
場合はGIT_DIR、環境変数が設定されている、それはデフォルトの代わりに使用するパスを指定する.gitリポジトリのベースのために。--git-dirコマンドラインオプションも、この値を設定します。

ここでJanKrügerのコメントが出てきます。Gitフックを作成するときは、Gitがいくつかの環境変数を設定する可能性があることに注意する必要があります。もし$GIT_DIR、相対パス名に設定されている、とあなたはそれをオーバーライドしていない、とあなたはチェンジディレクトリを行う、あなたはすべての様々なGitのサブコマンドでは、リポジトリを見つける方法が変更されます。したがって、あなたはどちらかしなければならない国連が(デフォルト得るためにそれを-set $GIT_DIR-not-セット動作)、または明示的に(ディレクトリの変更を渡ってそれを維持するために)絶対パスに設定、または明示的に設定し、パス、相対または絶対のあなたはどのような行動に応じて、いくつかの他のリポジトリ、したいです

--work-treeセット$GIT_WORK_TREE、および他の同様の変数があることに注意してください。ただし、少なくともこれまでのすべてのGitバージョンで$GIT_DIRは、Gitフックの「プリセット」(または「煩わしさ」:-))は1つだけです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

print(dir())とdir()の違い

分類Dev

/ dirと/ dir /の違い

分類Dev

WindowsとWSL間でgitリポジトリのシンボリックリンクを共有する

分類Dev

ネットワーク共有のリポジトリでgitフックを実行すると、どのバイナリが使用されますか?

分類Dev

JGitのメモリ内リポジトリを使用して、ローカルでチェックアウトせずに1つの小さなファイルを大きなGitリポジトリに追加することは可能ですか?

分類Dev

gitを使用してリポジトリのクローンを作成することはできません

分類Dev

Git:親リポジトリから分割せずにプライベートリポジトリのサブフォルダをパブリックリポジトリとして作成するにはどうすればよいですか?

分類Dev

ファイル プロトコルでクローンを作成すると git リポジトリが大きくなるのはなぜですか

分類Dev

gitのリポジトリとブランチの違いは何ですか?

分類Dev

VisualStudioとGitの使用。Gitリポジトリに新しいフォルダをコミットするにはどうすればよいですか?

分類Dev

--depth = 1でクローンを作成するときに、Gitリポジトリでコミットの数を見つけます

分類Dev

gitlab-ciの.gitmodulesを使用して別のgitリポジトリをフェッチすることはできません

分類Dev

異なるgitリポジトリでバックエンド(laravel)とフロントエンド(角度)の依存関係を処理する方法

分類Dev

ローカルリポジトリ内の特定のブランチへのマージを防ぐためにgitフックを作成しますが、リモートからプルすることはできます

分類Dev

gitリポジトリのクローンを作成するときにppkキーを使用する

分類Dev

2つのgit-svnリポジトリを通常のgitコミットとマージする

分類Dev

gitリポジトリのクローンを作成するときにGatsbyが開発に失敗する

分類Dev

gitリポジトリにN個の作業ツリーを含めることはできますか

分類Dev

git リポジトリを別のリポジトリ (たとえば、github ページ) のフォルダーにプッシュすることはできますか?

分類Dev

git-ワークツリーと共有リポジトリの違いは?

分類Dev

GITでリポジトリとして既存のディレクトリを作成する

分類Dev

大きなgitリポジトリのクローンを作成することで外付けHDDを破壊することは可能ですか?

分類Dev

gitリポジトリのHTTPSURLを指定すると、SSH URLを取得できますか?

分類Dev

リポジトリのクローンを作成するときに存在しない不要なフォルダーを表示するGit

分類Dev

gitを使用したgitリポジトリの作成とアクセシビリティに関する問題

分類Dev

GitリポジトリをLINUXマシンに複製するときに使用する「標準」ディレクトリの場所は何ですか

分類Dev

既存のgitリポジトリを新しいものとマージする

分類Dev

ローカルファイルをGitプルで上書きする| すべてのローカルファイルとディレクトリを破棄し、リポジトリから完全な最新コードをgitします

分類Dev

Spring Cloud Config Server は、設定の更新をリモートの git リポジトリにプッシュすることもできますか?

Related 関連記事

  1. 1

    print(dir())とdir()の違い

  2. 2

    / dirと/ dir /の違い

  3. 3

    WindowsとWSL間でgitリポジトリのシンボリックリンクを共有する

  4. 4

    ネットワーク共有のリポジトリでgitフックを実行すると、どのバイナリが使用されますか?

  5. 5

    JGitのメモリ内リポジトリを使用して、ローカルでチェックアウトせずに1つの小さなファイルを大きなGitリポジトリに追加することは可能ですか?

  6. 6

    gitを使用してリポジトリのクローンを作成することはできません

  7. 7

    Git:親リポジトリから分割せずにプライベートリポジトリのサブフォルダをパブリックリポジトリとして作成するにはどうすればよいですか?

  8. 8

    ファイル プロトコルでクローンを作成すると git リポジトリが大きくなるのはなぜですか

  9. 9

    gitのリポジトリとブランチの違いは何ですか?

  10. 10

    VisualStudioとGitの使用。Gitリポジトリに新しいフォルダをコミットするにはどうすればよいですか?

  11. 11

    --depth = 1でクローンを作成するときに、Gitリポジトリでコミットの数を見つけます

  12. 12

    gitlab-ciの.gitmodulesを使用して別のgitリポジトリをフェッチすることはできません

  13. 13

    異なるgitリポジトリでバックエンド(laravel)とフロントエンド(角度)の依存関係を処理する方法

  14. 14

    ローカルリポジトリ内の特定のブランチへのマージを防ぐためにgitフックを作成しますが、リモートからプルすることはできます

  15. 15

    gitリポジトリのクローンを作成するときにppkキーを使用する

  16. 16

    2つのgit-svnリポジトリを通常のgitコミットとマージする

  17. 17

    gitリポジトリのクローンを作成するときにGatsbyが開発に失敗する

  18. 18

    gitリポジトリにN個の作業ツリーを含めることはできますか

  19. 19

    git リポジトリを別のリポジトリ (たとえば、github ページ) のフォルダーにプッシュすることはできますか?

  20. 20

    git-ワークツリーと共有リポジトリの違いは?

  21. 21

    GITでリポジトリとして既存のディレクトリを作成する

  22. 22

    大きなgitリポジトリのクローンを作成することで外付けHDDを破壊することは可能ですか?

  23. 23

    gitリポジトリのHTTPSURLを指定すると、SSH URLを取得できますか?

  24. 24

    リポジトリのクローンを作成するときに存在しない不要なフォルダーを表示するGit

  25. 25

    gitを使用したgitリポジトリの作成とアクセシビリティに関する問題

  26. 26

    GitリポジトリをLINUXマシンに複製するときに使用する「標準」ディレクトリの場所は何ですか

  27. 27

    既存のgitリポジトリを新しいものとマージする

  28. 28

    ローカルファイルをGitプルで上書きする| すべてのローカルファイルとディレクトリを破棄し、リポジトリから完全な最新コードをgitします

  29. 29

    Spring Cloud Config Server は、設定の更新をリモートの git リポジトリにプッシュすることもできますか?

ホットタグ

アーカイブ