リポジトリに存在せずにリポジトリに対してGitコマンドを実行する方法はありますか?
たとえば、次のようなもの:git /home/repo log
?
言わないでくださいcd
。私はexec
電話でこれを行っています。
リポジトリに存在せずにリポジトリに対してGitコマンドを実行する方法はありますか?
たとえば、次のようなもの:git /home/repo log
?
言わないでくださいcd
。私はexec
電話でこれを行っています。
回答:
試してください:
git --git-dir=/home/repo/.git log
リポジトリの.gitディレクトリまでのパスを指定することが重要です。そうしないと、次のようなエラーメッセージのみが表示されます。
fatal: Not a git repository
fatal: Not a git repository (or any of the parent directories): .git
ます。@パトリック私は何も反対票を投じなかったのですか?
--work-dir
私が思うと言っていました)
git status
。-C
正しい方法です。
-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デザインの選択肢があります。
git stash
--git-dir
および--work-tree
を使用すると失敗するサブコマンドの別の例です。
実際、-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
これは@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
。
どの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