gitで特定のディレクトリをプルする方法


193

私はgitを使用したプロジェクトを持っていますが、subversionと同じようにmyproject / javascriptのように、特定のディレクトリを複製またはプルしたいだけです。
いくつかの変更を行い、コミットして再度プッシュします。
それが可能だ?


3
まばらなチェックアウトは(あなたはまだすべてを取得する必要がありますが)あなたが興味があります参照stackoverflow.com/questions/2416815/...
VonC

回答:


205
  1. リポジトリのコピーの上部にcdします
  2. git fetch
  3. git checkout HEAD path/to/your/dir/or/file

    • path/...(3)の「」は、「.../file」を含むリポジトリルートのすぐ下のディレクトリから始まります

    • 「HEAD」の代わりに、特定のコミットのハッシュコードが使用され、そのコミットに固有のリビジョン(ファイル)またはリビジョン(dir)を取得することに注意してください。


1
質問を誤解していることに気づきました。代わりに、私の回答は、単一のファイルをチェックアウトして、変更およびコミットする方法を説明しています。
vergueishon

質問のタイトルに対処しましたが、これで十分です。これは私を救っただけなので、私に関する限り、これは正解です。特に、これがこの問題でGoogleにヒットしたためです。
モルゴン

21
ただし、これでもリポジトリ全体を取得できます。サイズは2ギガバイトのプロジェクトのために、これは多くの時間は保存されません...
Pithikos

5
これらのコメントを読んで、これがどのように質問に答えないのかわからない場合、この解決策は、その1つのフォルダーのみのコピーを提供しますが、作業コピーではありません。つまり、変更したり再実行したりすることはできません。 -コミット。@Morgonが言ったように、それは質問のタイトルに対処します(dirを1つだけプルできます)が、質問の本文には答えません(「いくつかの変更を行い、コミットして再度プッシュバックします」)。
msb 2017年

ただし、@ StanHolodnak --は必須ではありません。その後のビットを強制的にパスとして解釈します。あなたが名前のファイルがある場合はそう、そう、--helpあなたはこれらのハイフンでそれを前に置く、チェックアウトしたいことを必要とされるであろう:git checkout HEAD -- --help
ティムVisée

105

空のディレクトリ:

git init
git remote add [REMOTE_NAME] [GIT_URL]
git fetch REMOTE_NAME
git checkout REMOTE_NAME/BRANCH -- path/to/directory

この作品だけローカルファイルを置き換えるために、ファイルのリモートバージョンを使用したい場合は、私が考える
ジョン

これはフォルダもプルします。フォルダをダウンロードしないで、フォルダ内のものだけをダウンロードするにはどうすればよいですか?
Al Kasih

コマンドfetchcheckoutコマンドは必要ありませんremote add。コマンドの後にプルリクエストを送信するだけで、マスターブランチ全体を取得できます。
Iqra。

2
Pithkosが承認済みの回答で指摘しているように、この回答もWHOLEリモートリポジトリをローカルマシンにダウンロードします。shingaraの答えは最も明確です。リポジトリの一部をリモートでプルする方法はありません。ただし、WHOLEフェッチの帯域幅を気にせず、ローカルキャッシュの一部の作業用コピーを作成することに関心がある場合は、受け入れられた回答がその方法を示します。ただし、リポジトリに(圧縮形式で)履歴全体をマシンにダウンロードする必要があることを明確にしたいだけです。
Gabe Halsmer、

39

答えを見つけて、あきらめないで、もう一度試すなど、多くのことを探した後、私はようやく別のSOスレッドでこれに対する解決策を見つけました:

1つのフォルダーを除くすべてをgit-pullする方法

そこにあるものをコピーして貼り付けるには:

git init
git remote add -f origin <url>
git config core.sparsecheckout true
echo <dir1>/ >> .git/info/sparse-checkout
echo <dir2>/ >> .git/info/sparse-checkout
echo <dir3>/ >> .git/info/sparse-checkout
git pull origin master

OPが望むことを行うには(1つのディレクトリでのみ作業)、.git/info/sparse-checkout上記の手順を実行するときに、その1つのディレクトリをに追加します。

@cforbishに感謝します!


2
これを投稿するのは、Googleがその方法をグーグルしようとするときはいつでも、これが一番の結果であり、そのスレッドが表示されるほど近くないためです。:(私はコピー貼り付けが悪いと感じていますが、それがとてもベストプラクティスだと思いますか?
msb

1
これが唯一のクリーンなソリューションです。上記の答えを試してみました。他の回答でブランチをチェックアウトした後、プルできず、コミットが必要な新しいファイルがいくつかありました。このソリューションでは、すべてが正しく見えます。しかし、注:チェックアウトされたブランチに関係なく、gitはあなたがにいると考えます mastergit branch --set-upstream-to=origin/<branch>正しく引き抜くようにしてください
ビスケット2018年

12

不可能です。すべてのリポジトリをプルするか、何もプルする必要はありません。


1
すべてをフェッチする必要がある場合でも、この場合、疎なチェックアウト作業ツリーをプルする必要がありますか?stackoverflow.com/questions/2416815/…を
VonC 2010年

10
これを追加するだけで、ディレクトリだけをプルできないのは、gitがファイルのセマンティックトラッキングではなくデータのセマンティックトラッキングを使用しているため、ソースに通知せずにコード(または他のデータ)をシームレスにファイルの内外に移動できるためです追跡システム(もちろん更新するまで。)このため、コードはシームレスにディレクトリに出入りできます。そのため、1つのディレクトリだけを取得してもあまり意味がありません。お役に立てれば。
OmnipotentEntity 2010年

12
@OmnipotentEntity申し訳ありませんが、私見はそれ理にかなっています。実装は使用を制限すべきではありません。Gitはディレクトリが何であるかを知っています(少なくともローカルの作業コピーを作成する場合)ので、サーバーで同様の操作を実行できず、関連する出力を送信するだけの理由はありません。確かに、それは現在実装されていませんが、機能の欠如によるものであり、根本的な不可能性ではありません。個人的には、これはかなり重要な機能だと思いますが、ちょっと、それが可能であればgitを使用しない理由の1つです。
基本的な

10

多分このコマンドは役に立つかもしれません:

git archive --remote=MyRemoteGitRepo --format=tar BranchName_or_commit  path/to/your/dir/or/file > files.tar

「Etvoilà」


2
これは、アーカイブ目的でファイルの特定のディレクトリをダウンロードします。これは、変更してプッシュバックできるコピーをプルしません。
leetNightshade

とてもかっこいい。おそらくOPの解決策としては受け入れられませんが、実際は取得したくないさらに大きなリポジトリ内の大きなフォルダーの内容を検索する必要があるだけなので、実際にはそれが目的でした。変更する必要はありません/押す。
オリバー

7

入力せずにディレクトリの最新の変更を取得したい場合は、次のようにします。

$ git -C <Path to directory> pull

4

git clone --filter Git 2.19から

このオプションは、実際にはサーバーからの不要なオブジェクトのフェッチをスキップします。

現在のサポート状況を説明する詳細な回答を書きました:Gitリポジトリのサブディレクトリのみを複製するにはどうすればよいですか?

git cloneその領域で実装されるものはgit pullどれも類似物を持つ可能性が非常に高いです。


1

この作品を試してテストしました!

mkdir <directory name> ;  //Same directory name as the one you want to pull
cd <directory name>;
git remote add origin <GIT_URL>;
git checkout -b '<branch name>';
git config core.sparsecheckout true;
echo <directory name>/ >> .git/info/sparse-checkout;
git pull origin <pull branch name>

これがお役に立てば幸いです!


0

場合によっては、差分を厳密に調べなくても、以前のファイルのコピーを確認したいだけです。

そのような場合、リポジトリのクローンを作成し、関心のある特定のコミットをチェックアウトして、そのクローンされたリポジトリのサブディレクトリを確認するのと同じくらい簡単です。すべてがローカルであるため、完了したらこのクローンを削除できます。


-1

私のように理論​​的なファイルパスと例に苦労しているすべての人のために、ここで実際の例を示します。Microsoftはgit hubでドキュメントと例を提供していますが、残念ながら、このリポジトリの大量のトピックについてすべての例ファイルを収集しています。

https://github.com/microsoftarchive/msdn-code-gallery-community-s-z

パス内のMicrosoft Dynamics jsファイルのみに興味があった

msdn-code-gallery-community-s-z/Sdk.Soap.js/

だから私は次のことをしました

作成する

msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout

ディスク上のリポジトリフォルダー内のファイル

git sparse-checkout init

Windowsでcmdを使用してそのディレクトリに

のファイル内容

msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout

です

Sdk.Soap.js/*

最後に

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