gitディレクトリにないときのgit pull


308

/X/Ygitリポジトリであるディレクトリがあるとします。git pull内部からのようにコマンドを呼び出すことは可能です/Xが、/X/Yディレクトリを対象としていますか?

編集:私は具体的に疑問に思っていたと思います:gitコマンドを使用してこれを行うことは可能ですが、ディレクトリを変更する必要はありませんか?

注:以前のオプションよりもはるかにエレガントであるため、VonCの回答を受け入れました。1.8.5より古いGitを実行している人は、下記のbstpierreの回答を参照してください。


2
GIT_DIRの設定を解除しない限り、フック内でgit-pullを使用しても機能しないことを追加したいと思います。関連。
zpmorgan

git 1.8.5(2013年第4四半期)以降、「gitコマンドを使用できますが、ディレクトリを変更する必要はありません」。以下の私の回答を
VonC

回答:


453

開始gitの1.8.5(Q4 2013) 、あなたは、「しかし、ディレクトリを変更することなく、Gitのコマンドを使用」することができるようになります。

make -C <directory>」、git -C <directory> ...」のように、Gitに他のことをする前にそこに行くように指示します

参照してください44e1e4コミットによってナズリRamliy

現在のディレクトリを離れることなく別のディレクトリでGitコマンドを呼び出すには、さらにキーを押す必要があります。

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-tree=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

上記の方法はスクリプトで使用できますが、コマンドラインをすばやく呼び出すには面倒です。

この新しいオプションを使用すると、より少ないキーストロークで上記を実行できます。

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done

Gitの2.3.4(2015年3月)、およびので6a536e2をコミットすることにより、カルティクナーヤカ(KarthikNayakgit「扱いますgit -C '<path>'と」ときノーOP <path>は空です。

' git -C ""'はエラー " Cannot change to ''" で失敗しましたが、シェルはcd "" 'を何もしないものとして扱います。
シェルの動作を前例として、git-C "" 'を何もしないものとして扱うことも教えてください。


4年後、Git 2.23(2019年第3四半期)は「git -C ""」が機能し、ディレクトリを変更しないことを文書化します

6a536e2以降、そのように動作しています(空の場合、git" git -C '<path>'"を何もしないものとして扱い<path>ます、2015-03-06、Git v2.3.4)。

つまり、ドキュメントには(最終的に)次のものが含まれます。

' <path>'は存在するが空-C ""などの場合、現在の作業ディレクトリは変更されません。


git -C例として、Git 2.26(2020年第1四半期)での使​​用を確認できます。

参照b441717コミット9291e63コミット5236fceコミット10812c2コミット62d58cdコミットb87b02cコミット9b92070コミット3595d10コミットf511bc0コミットコミットf6041abf46c243コミット99c049bコミット3738439をコミット7717242をコミットb8afb90コミット(2019年12月20日)デントン劉(Denton-L
(合併によりJunio C浜野- gitster-381e8e9コミットし、2020年2月5日)を

t1507: 列をなして full_name()

サインオフ:Denton Liu

以前、私たちは走っていましたtest_must_fail full_name。ただし、test_must_failgitコマンドでのみ使用する必要があります。
インラインfull_name()我々は、使用できるようtest_must_failgit直接コマンド。

28fb84382b( "Introduce notation"、2009-09-10、Git v1.7.0-rc0- merge)でfull_name()導入されたとき、このオプションはまだ利用できませんでした(44e1e4d67d( " :与えられたディレクトリで実行されるため) -Cオプション付き」、2013年9月9日、Git v1.8.5-rc0- バッチ#5に記載されているマージ))。 その結果、ヘルパー関数により、毎回手動で行う必要がなくなりました。ただし、は現在利用可能であるため、代わりにインラインで使用できます。<branch>@{upstream}git -Cgit
cdgit -Cfull_name()


6
素敵な!これはもっとエレガントなので、将来の視聴者に受け入れられるようにします。
Gavin Anderegg 2013年

1
私には機能しません:#git --version && git -C〜/ .m2 / checkout master git version 1.8.3.4(Apple Git-47)不明なオプション:-C使用法:git [--version] [--help ] [-c name = value] [--exec-path [= <path>]] [--html-path] [--man-path] [--info-path] [-p | --paginate | --no-pager] [--no-replace-objects] [--bare] [--git-dir = <path>] [--work-tree = <path>] [--namespace = <name> ] <command> [<args>]
Jan Galinski、2014

7
@JanGalinskiしかし、「Starting git 1.8.5」については触れました。そのため、git 1.8.3.xはそのオプションをまだ認識していません。
VonC、2014年

2
Ubuntu 12.04では、新しいgitバージョンをインストールする必要がありました。私は次のようにしました:apt-get install software-properties-common python-software-propertiesgit repoを追加しadd-apt-repository ppa:git-core/ppaます。最後のステップはgit:を更新することですapt-get update && apt-get upgrade
ph3nx 2014年


54

編集

にバグがあるか、git pullそのコマンドで実行しようとしていることを実行できません。ただし、フェッチとマージでそれを行うことができます。

cd /X
git --git-dir=/X/Y/.git fetch
git --git-dir=/X/Y/.git --work-tree=/X/Y merge origin/master

元の答え

bashなどを実行しているとすれば、実行できます(cd /X/Y; git pull)

gitのmanページには、いくつかの変数は、彼らが助けるべきであるように見える(「gitのリポジトリ」を参照)を指定するが、私は彼らが(私のリポジトリ内の/ tmp / ggg2で)正しく動作することはできません。

GIT_WORK_TREE=/tmp/ggg2 GIT_DIR=/tmp/ggg2/.git git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.

cwdが次のコマンドを実行しているときに/ tmpがリポジトリを更新しますが、更新されたファイルは作業ツリー/ tmp / ggg2ではなく/ tmpに表示されます。

GIT_DIR=/tmp/ggg2/.git git pull

およびフラグを示す同様の質問に対するこの回答も参照してください。--git-dir--work-tree


GIT_WORK_TREEだけを使用してみましたか?
Arrowmaster

@Arrowmaster:はい、そうすると、gitは.gitディレクトリを見つけることができません。
bstpierre 2011

そう、GIT_DIRが設定されていない場合、GIT_WORK_TREEは使用されないとマニュアルページに記載されています。両方を使用すると、動作しないのは奇妙に思えます。
Arrowmaster

@Arrowmaster:どこかにバグがあるのか​​しら。実行するとgit --git-dir=/tmp/ggg2/.git --work-tree=/tmp/ggg2 pull、エラーメッセージが表示されます。しかしgit --git-dir=/tmp/ggg2/.git --work-tree=. pull、/ tmpにいる間に実行すると、更新されたファイルが/ tmpに配置されます。
bstpierre 2011

@bstpierre:私は今、インストールのgitを使用してシステムへのアクセスを持っていないが、私は私が他の選択肢をしようとするだろうしなかった場合--work-treeのように、今--work-tree=/tmp/ggg2/--work-tree=/tmp/ggg2/.するので、それはそのパスを解析する方法に問題がある可能性があります。
Arrowmaster

32

あなたはそれをbashスクリプトまたはgitエイリアスでラップすることができます:

cd /X/Y && git pull && cd -

1
これで間違いなくうまくいきますが、ディレクトリを変更せずにgitコマンドを使用する方法があるかどうか疑問に思っています。ないと思い始めています。
Gavin Anderegg、2011

1
pushd/popd代わりにペアを使用してくださいcd/cd-
axd

それとも、CDのバックに持つ防ぐためにサブシェルを使用することができます(cd xyz && git pull)
jarmod

30

この投稿は少し古いので、バグがあり、修正された可能性がありますが、私はこれを実行しました:

git --work-tree=/X/Y --git-dir=/X/Y/.git pull origin branch

そしてそれはうまくいった。dotfileと親ディレクトリが必要であることを理解するのに少し時間がかかりました(標準設定では、これらは常に親/子ですが、すべての設定ではないため、明示的に指定する必要があります。


\\ remotemachine \ C $ \ folder \ etcなどのディレクトリで動作するため、このソリューションが好きです
twasbrillig

7

一部のサーバーは古いUbuntu LTSバージョンを使用しているため、gitを最新バージョンに簡単にアップグレードできません(いくつかの回答で説明されているように-Cオプションをサポートしています)。

このトリックは私にとってはうまくいきます。特に、開始した場所とは別のディレクトリに移動する他の回答の副作用がないためです。

pushd /X/Y
git pull
popd

または、ワンライナーとしてそれを行う:

pushd /X/Y; git pull; popd

LinuxとWindowsの両方にpushdコマンドとpopdコマンドがあります。


5

組み合わせを使用してpushdgit pullそしてpopd、私たちは、この機能を実現することができます:

pushd <path-to-git-repo> && git pull && popd

例えば:

pushd "E:\Fake Directory\gitrepo" && git pull && popd

これは素晴らしいです。完璧に動作します
Stretch0

4

次のようなスクリプトを書くことができます:

cd /X/Y
git pull

のような名前を付けることができgitpullます。
あなたがそれをしたいのであれば、代わりに任意のディレクトリを実行してください/X/Y

cd $1
git pull

その後、gitpull /X/Z
最後にそれを呼び出すことができます、あなたはリポジトリを見つけることを試みることができます。~/gitリポジトリを含むフォルダがあります。これを使用して、すべてのリポジトリをプルできます。

g=`find /X -name .git`
for repo in ${g[@]}
do
    cd ${repo}
    cd ..
    git pull
done

2
コマンドラインから実行する場合は、サブシェルで実行するだけです(cd /X/Y && git pull)
カスカベル

2

リモートサーバーでdrush(Drupalシェル)コマンドを使用してこれを実行しようとしていた私のような人は、作業ディレクトリにCDを挿入する必要があるソリューションを使用できません。

代わりに、プルをフェッチとマージに分割するソリューションを使用する必要があります。

drush @remote exec git --git-dir=/REPO/PATH --work-tree=/REPO/WORKDIR-PATH fetch origin
drush @remote exec git --git-dir=/REPO/PATH --work-tree=/REPO/WORKDIR-PATH merge origin/branch

1

これは同様の問題である可能性がありますが、単純にコマンドをチェーンすることもできます。例えば

一行に

cd ~/Sites/yourdir/web;git pull origin master

またはSSH経由。

ssh username@atyourserver.com -t "cd ~/Sites/thedir/web;git pull origin master"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.