Gitクローン:ファイルだけですか?


141

GITリポジトリのクローンを作成し、.gitディレクトリを作成したくない。つまり、ファイルが欲しいだけです。これを行う方法はありますか?

git clone --no-checkout私が望むものとは正反対のことをしました(.gitディレクトリだけを与えました)。

ローカルリポジトリではなく、リモートリポジトリに対してこれを実行しようとしています。これは、「「git export」を実行する方法(「svn export」など)の複製ではないことを意味します(解決策は、同じ)。



@Greg Hewgillこれをリモートリポジトリから実行しようとしています。しかし、それがこの質問をユニークにするかどうかはわかりません。
Dan Rosenstark、

1
これは、新しい質問ですが、私は思うけれども、これはチェックアウトする価値がある:stackoverflow.com/questions/11497457/...
eonil

1
私の更新の回答を参照してください:git archiveより正確になり(2017年第4四半期)、空のフォルダーは含まれなくなります。
VonC、2017

1
どういたしまして。どうやら、あなたのコメントにフラグが付けられて削除されました... chat.stackoverflow.com/transcript/134259?m=39402889#39402889
VonC

回答:


75

あなたがでます探しているものから最も近いだろうgitのコマンドgit archivegitを使用するプロジェクトのバックアップを
参照してください。すべてのファイル(スクリプトを使用している場合はサブモジュールを含む)がアーカイブに含まれます。git-archive-all

その後、そのアーカイブをどこでも使用でき、ファイルのみが返され、.gitディレクトリは返されません。

git archive --remote=<repository URL> | tar -t

最初のレベルからのみフォルダとファイルが必要な場合:

git archive --remote=<repository URL> | tar -t --exclude="*/*"

リモートリポジトリの第1レベルのフォルダーのみを一覧表示するには:

git archive --remote=<repository URL> | tar -t --exclude="*/*" | grep "/"

注:GitHubではサポートされいません(サポートされいません)

したがって、クローンを作成し(クローン作成のステップを短くするために浅く)、ローカルにアーカイブする必要があります。

git clone --depth=1 git@github.com:xxx/yyy.git
cd yyy
git archive --format=tar aTag -o aTag.tar

別のオプションは、浅いクローンを作成することです(以下で説明)。ただし、.gitフォルダーを別の場所に配置します。

git --git-dir=/path/to/another/folder.git clone --depth=1 /url/to/repo

repoフォルダーにはファイルのみが含まれ、は含まれません.git

注:git --git-dirコマンドのgitオプションであり、ではありませんgit clone


Git 2.14.X / 2.15(2017年第4四半期)で更新:空のフォルダーを追加しないようにします

git archive」は、特にpathspecと一緒に使用すると、Git自体が空のディレクトリを作成しない場合でも、その出力に空のディレクトリが保存されていました。
これは修正されました。

RenéScharfe``)によるコミット4318094(2017年9月12日)を参照してください。
提案者:ジェフキング(peff
(合併によりJunio C浜野- gitster-62b1cb7コミットし、2017年9月25日)を

archive:空のディレクトリをアーカイブに追加しない

gitは空のディレクトリを追跡しませんgit archiveが、だまされて一部をアーカイブに入れる可能性があります。
これはオブジェクトデータベースでサポートされていますが、インデックスで表すことができないため、実際に発生することはほとんどありません。

空のディレクトリはgitでサポートされていないため、アーカイブにも書き込まないでください。
空のディレクトリが本当に必要な場合は、空の.gitignoreファイルをその中に置くことによって追跡およびアーカイブできます。


4
これでうまくいきました。もう1つ追加します。あなたがすべてで.gitフォルダ気にしないのであれば、私は、このコマンドを使用しますgit --git-dir=/dev/null clone --depth=1 /url/to/repo
HumanSky

これは.gitフォルダを削除しません
aliasav

@VonC私が試した:git --git-dir = / dev / null clone --depth = 1 / url / to / repo
aliasav

1
走っgit archive --remote=https://github.com/pornel/dssim.git @ | tar -tているtar: This does not look like a tar archive。GitHubで動作しませんか?また、どういう@意味ですか?
アンドレ・Werlang

2
@AndréWerlang7年後...私はあまり確信がありません@:削除しました。また、GitHubはリモートをサポートしていませんgit archive。代替案を提案するために回答を編集しました。
VonC 2017


42

浅いクローンを作成して、最後のいくつかのリビジョンのみを取得できます。

 git clone --depth 1 git://url

次に、単に.gitディレクトリを削除するかgit archive、ツリーをエクスポートするために使用します。


クローンを繰り返して更新すると、このエラーを回避できます:「致命的:宛先パス 'XYZ'はすでに存在し、空のディレクトリではありません。」
Sohail Si

1
@SohailSi:新しい場所に複製するか、古いディレクトリを削除します。ローカルコピーを更新する場合は、新しいリビジョンをフェッチするだけの方がよいでしょう。
knittl 2015

3

クローンを実行してから.gitディレクトリを削除して、作業コピーのみを作成するのはどうですか?

編集:または実際にはなぜクローンを使用するのですか?.gitディレクトリなしでgitリポジトリが必要だと言うと、少し混乱します。ツリーの一部の状態のコピーだけが必要な場合cp -Rは、git cloneの代わりにシェルで実行してから、.git後で削除してください。


それをありがとう。ファイルはgitリポジトリにあります。MacユーザーがGITリポジトリにならずに、リポジトリのコピーを1行で取得できるようにしたいと思っていました。
Dan Rosenstark、

リポジトリを使用できない場合(つまり、Gitリポジトリがない場合)は、リポジトリから直接コードを取得する必要はありません。
代替案、

@Amoss人々が常に最新のコードを取得しないようにtarballを解放しますか?
代替

1
@mathepic:そして、tarballをリリースするには、リポジトリからクリーンな作業コピーを取得する方法が必要です-これはまさに提起された問題です。
Andrew

1
以下の答えを読んでから少しグーグルを行うと、別の質問につながりました:stackoverflow.com/questions/160608/…git archive --remoteの使用を見てみると、それはあなた(と元のポスター)とまったく同じです) 探しています。編集:ジョンが下に答えたものです。
Andrew

2

ソースコードのコピーが欲しいだけのようです。もしそうなら、なぜ単にディレクトリをコピーして.gitディレクトリをコピーから除外しないのですか?


5
それが私が求めていることです:gitでそれを行う方法...しかし、私が得ている答えからそれを行う組み込みの方法がないことはすでにわかります。とにかくありがとう!
Dan Rosenstark、

2

git checkout -f

これを行うには、作業ツリーからリポジトリを分割する別の方法があります。

この方法は、これらのgit-less gitファイルを定期的に更新する必要がある場合に役立ちます。たとえば、ソースファイルをチェックアウトしてアーティファクトを構築する必要がある場合に使用し、次にアーティファクトを別のリポジトリにコピーしてサーバーにデプロイするだけです。また、ソースコードをサーバーにプッシュするときにも使用します。チェックアウトしてwwwディレクトリにビルドするソースコード。

2つのフォルダーを作成します。1つはgit用で、もう1つは作業ファイル用です。

mkdir workingfiles
mkdir barerepo.git

裸のgitリポジトリを初期化します。

cd barerepo.git
git --bare init 

次に、ポスト受信フックを作成します。

touch hooks/post-receive
chmod ug+x hooks/post-receive

お気に入りのエディターでポストレシーブを編集します。

GIT_WORK_TREE=/path/to/workingfiles git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]

これをリモートとして追加します。

git remote add myserver ssh://user@host:/path/to/barerepo.git

これで、このベアリポジトリにプッシュするたびに、作業ツリーがにチェックアウトされ/workingfiles/ます。しかし、/workingfiles/それ自体はバージョン管理されていません。で実行git statusする/workingfiles/と、エラーが発生しますfatal: Not a git repository (or any parent up to mount point /data)。それは単なるファイルです。

他のソリューションとは異なりrm -r .git、コマンドは必要ないので、/workingfiles/他のgitリポジトリがある場合、他のリポジトリのgitファイルの削除に使用されるコマンドについて心配する必要はありません。


1
同意した。ここでは、ベアリポジトリのポスト受信フックが可能です。+1
VonC、2018年

ファイルを取得するだけの場合は多くの作業が必要
Rainb

定期的にファイルだけが必要な場合は、それほど多くの作業は必要ありません。
スラム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.