リポジトリにいない状態でGitコマンドを実行するにはどうすればよいですか?


131

リポジトリに存在せずにリポジトリに対してGitコマンドを実行する方法はありますか?

たとえば、次のようなもの:git /home/repo log

言わないでくださいcd。私はexec電話でこれを行っています。


3
あなたはあなたのexec呼び出しとして単に「cd / home / repo && git log」することはできませんか?
Alex Howansky、2011

私はそれにいくつかの奇妙な問題を抱えています。私は実際にはexecではなく、新しいプロセスを開始していますが、それらの違いがよくわかりません。gitディレクトリを指定するパラメーターを見つけるだけの方が簡単だと思います。
タワー



1
git --git-dir = / home / repo / .git log
Atiq Ur Rehman

回答:


102

試してください:

git --git-dir=/home/repo/.git log

リポジトリの.gitディレクトリまでのパスを指定することが重要です。そうしないと、次のようなエラーメッセージのみが表示されます。

fatal: Not a git repository

2
私は得続けfatal: Not a git repository (or any of the parent directories): .gitます。@パトリック私は何も反対票を投じなかったのですか?
タワー

3
@パトリック答えは編集されました(もともとは--work-dir私が思うと言っていました)
Gareth、

1
コミットのすべてのファイルが削除済みとして表示されるため、これは私にとっては機能しませんでした。コミットはチェックしているがフォルダの内容はチェックしていないようです。より良いパフォーマンスについては@calandoaの回答を参照してください。
mxcd

2
最新のgitを使用しても機能しませんでしたが、-Cオプションを使用すると機能しました。例:git -C /home/repo/.git log
D.Snap

1
これは実際にはpoが期待どおりに機能しませんでした。なぜこれが受け入れられた答えなのですか?これは現在のディレクトリを作業ツリーとして使用し、指定された.gitを履歴に使用しますが、これは完全に間違っています。たとえば、ログだけを表示しない場合git status-C正しい方法です。

218

-Cオプションを使用(docs):

git -C /home/repo log

これは、通常のフォルダを追加することなく、ほぼ同じです--git-dir--work-tree.git

編集:

正反対に言えば、これが質問に対する唯一の正解であるため、反対票を投じた回答はかなり驚くべきものです。オプション--git-dirとは、--work-tree作業ツリーの外からリポジトリにアクセスするために、既存のされていない、彼らが移動するために使用されている.git他のどこかに、彼らははるかにいくつかのケースでの使用に複雑されています。

たとえば、次のログ/home/repo/subdirのみを取得するには:

git -C /home/repo/subdir log .

または

git -C /home/repo log subdir

使用することはできないlog .--git-dir--work-tree。作業ツリーの最上部からの相対パスでサブパスを抽出するようにパスを処理する必要があります。その場合でも、--オプションを使用しない場合、gitはそれをパスとして認識しません。そのため、唯一可能な方法は次のとおりです。

git --git-dir /home/repo/.git log -- subdir

さらに、私のバージョン(git 1.9.1)--work-treeではlogサブコマンドを使用してもまったく機能しません。無視されます:

git --git-dir /home/repo/.git --work-tree /home/repo/subdir log -- subdir
git --git-dir /home/repo/.git --work-tree /home/repo/whatever log -- subdir

これがバグなのか機能なのかさえわかりません...いつものように多くのgitデザインの選択肢があります。


追加の説明を追加していただきありがとうございます。
エリックG.

git stash--git-dirおよび--work-treeを使用すると失敗するサブコマンドの別の例です。
d5ve 2016

4
-Cオプションは、2013年に発売されたのgitのバージョン1.8.5で追加されました
d5ve

-Cは--git-dirよりもうまく機能しました... -Cはリポジトリのgit構成設定を尊重します。gitバージョン1.9.5.msysgit.1を実行しています
Straff

@calandoa常にルートからの場所を指定する必要がありますか。リポジトリの名前に複数の単語が含まれている場合、もう1つ、このコードでどのように入力するのですか
Kasun Siyambalapitiya

17

実際、-git-dirと--work-treeを一緒に使用する必要があります。次に例を示します。

local [] Desktop: mkdir git
local [] Desktop: cd git
local [] git: touch README.txt
local [] git: git init
Initialized empty Git repository in /Users/albert/Desktop/git/.git/
local [] git: cd ..
local [] Desktop: git --work-tree=git --git-dir=git/.git add .
local [] Desktop: git --work-tree=git --git-dir=git/.git commit -a -m 'initial commit, called from outside the git directory'
[master (root-commit) ee951b1] initial commit, called from outside the git directory
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.txt
local [] Desktop: cd git
local [] git: git log --pretty=oneline
ee951b161053e0e0948f9e2a36bfbb60f9c87abe initial commit, called from outside the git di

1
これは、-git-dirのみを使用した回答よりも正確です。git-scm.com/blog/2010/04/11/environment.html
エリックG.

11

何度も試しました!やっとできた!

git -C dir --no-pager log --format='%an' -1 filename

覚えておいてください、あなたに.gitを追加しないでください

-C dir


3

これは@maxの答えに似ています。残念ながら、--git-dirは私が必要としたことをしませんでした。編集振り返ってみると、私が読んだことのない別の[前の]回答がの使用を提案しました--work-tree。環境またはフラグを使用する方が適切かどうかわからないので、誰かが使用を見つけた場合に備えて回答を残しますが、--work-tree/ を使用するように切り替えます--git-dir


2つのリポジトリがあり、1つは他の内部にありますが、サブモジュールはありません。外側のリポジトリはそれを無視します:

tools (outer repo)
  gcc/4.9.2 (inner repo)

私が欲しかったのはgit rev-parse --show-prefix、外部レポに対する出力です。これが私が思いついたものです(bash構文、読みやすくするために複数行に分割しています):

prefix_dir=$(cd ..; git rev-parse --show-toplevel)
prefix_dir=$(GIT_WORK_TREE=${prefix_dir} git rev-parse --show-prefix)

4.9.2内から実行すると、文字列が生成されますgcc/4.9.2


1

どのgitコマンドでも、次のことができます。

git --git-dir=<PATH-TO-REPO>/.git --work-tree=<PATH-TO-REPO> <git-command>

たとえば、gitステータスを実行する場合は、次のようにします。

 git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  status

または、ブランチを確認したい場合は、リポジトリが入っています:

git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  rev-parse --abbrev-ref HEAD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.