「git export」(「svn export」など)を実行しますか?


2356

.gitリポジトリディレクトリなしでツリーのコピーを作成する「git export」という優れたソリューションがあるかどうか疑問に思っていました。私が知っている方法は少なくとも3つあります。

  1. git cloneその後、.gitリポジトリディレクトリを削除します。
  2. git checkout-index この機能をほのめかしますが、「目的のツリーをインデックスに読み込むだけです...」で始まります。方法は完全にはわかりません。
  3. git-exportは、基本的にgit clone一時的な場所に移動し、続いrsync --exclude='.git'て最終的な宛先に移動するサードパーティのスクリプトです。

これらの解決策はどれも、本当に満足できるものではありません。最も近いのはsvn exportオプション1かもしれません。どちらも最初にターゲットディレクトリを空にする必要があるためです。しかし、オプション2は、ツリーをインデックスに読み込むことが何を意味するかを理解できると仮定すると、さらに良いようです。


1
@rnrTom:Somovの回答を参照してください。(tarアーカイブには「圧縮」されたものはありません)。
エタリオン

23
@mrTom git archive --format zip --output "output.zip" master -0は非圧縮アーカイブを提供します(-0は非圧縮のフラグです)。git-scm.com/docs/git-archive

7
私は@mrTomに同意します。アーカイブが圧縮されているか、圧縮されていないかが主な問題だとは思いません。SVNを使用exportすると、リモートリポジトリから250 kBのサブディレクトリを直接作成できます(それ以外の場合は、リビジョンを除いてサイズが200 MBになる可能性があります)。ネットワークにアクセスするのは、250 kB(またはそれ以上)のダウンロード転送のみです。ではgitarchiveサーバーで有効にする必要があります(そのため、私は試すことができません)- clone --depth 1サーバーから、たとえば25 MBのレポを取得する場合があり、.gitサブフォルダーだけで15 MBを使用します。したがって、答えは「いいえ」です。
sdaau 2013年

@mrTom答えは実際にはYES OPの答えを参照してください-コマンドがあるgit checkout-index
NOCACHE

ここに素晴らしくて簡単な方法があります:git archive -o latest.zip HEAD
エフゲニー・セルゲーエフ

回答:


2397

おそらくこれを実現する最も簡単な方法は、を使用することですgit archive。展開されたツリーだけが本当に必要な場合は、次のようにすることができます。

git archive master | tar -x -C /somewhere/else

ほとんどの場合、gitから何かを「エクスポート」する必要がありますが、いずれにしても圧縮アーカイブが必要なので、次のようにします。

git archive master | bzip2 >source-tree.tar.bz2

ZIPアーカイブ:

git archive --format zip --output /full/path/to/zipfile.zip master 

git help archive 詳細については、非常に柔軟です。


アーカイブには.gitディレクトリが含まれていなくても、.gitignore、.gitattributesなどの他のgit固有の非表示ファイルが含まれていることに注意してください。アーカイブに含めたくない場合は、 .gitattributesファイルでexport-ignore属性を使用し、アーカイブを行う前にこれをコミットします。続きを読む...


注:インデックスのエクスポートに関心がある場合、コマンドは

git checkout-index -a -f --prefix=/destination/path/

(詳細については、Gregの回答を参照してください)


198
ZIPアーカイブ:git archive --format zip --output /full/path master
Vadim 2010

221
アーカイブには.gitディレクトリは含まれませんが、.gitignore、.gitattributesなどの他の非表示のgit固有のファイルが含まれることに注意してください。したがって、それらが不要な場合は、export-ignore属性を必ず使用してください。 .gitattributesファイルを作成し、アーカイブを行う前にこれをコミットします。Feeding.cloud.geek.nz/2010/02/…を
mj1531 2010

54
ストリームをフォローアップするには、注:コマンドに '--prefix = something /'文字列を追加して、zip内にパックされるディレクトリ名を制御できます。たとえばgit archive --format zip --output /path/to/file.zip --prefix=newdir/ master、出力を使用する場合、「file.zip」という名前になりますが、解凍すると、最上位ディレクトリは「newdir」になります。(--prefix属性を省略した場合、最上位のディレクトリは「file」になります。)
Alan W. Smith

89
最も簡単な方法:git archive -o latest.zip HEAD現在のブランチの最新のコミットの内容を含むZipアーカイブを作成します。出力形式は、出力ファイルの拡張子によって推測されることに注意してください。
nacho4d

37
gitサブモジュールをサポートしていません:(
umpirsky

320

オプション2の意味を知りました。リポジトリから、次のことができます。

git checkout-index -a -f --prefix=/destination/path/

パスの最後のスラッシュは重要です。それ以外の場合、ファイルは/ pathのプレフィックスを持つ/ destinationにあります。

通常の状況では、インデックスにはリポジトリのコンテンツが含まれているため、「目的のツリーをインデックスに読み込む」ために特別なことはありません。それはすでにそこにあります。

-aフラグが(私はそれはそれは私がやりたいことがないので、このような状況では、このフラグを省略することが何を意味するのかわからないんだけど)、インデックス内のすべてのファイルをチェックアウトする必要があります。この-fフラグは、出力内の既存のファイルを強制的に上書きしますが、このコマンドでは通常は行われません。

これは私が探していた「git export」のようなものです。



1
このgit addコマンドはインデックスのコンテンツを変更するためgit status、「コミットされる」と表示されるのは、HEADとインデックスのコンテンツの違いです。
グレッグヒューギル

7
@conny:コメントを読んで忘れて、末尾のスラッシュなしでコマンドを実行します。ヒント:connyのアドバイスに従う-.-
Znarkus

35
+1からconnyのアドバイス。また、「〜/ dest /」を作成しようとしないでください。これにより、実際に必要なディレクトリではなく、「〜」というディレクトリが作業ディレクトリに作成されます。あなたが無思慮に入力するときに何が起こるかを推測するのrm -rf〜
カイルHeironimus

5
@KyleHeironimus-'〜/ dest / `の使用に関する警告は、プレフィックスパスを引用符で囲んでシェルにチルダ拡張を実行しないように指示した場合に当てはまります。~(ではなく'~')というディレクトリが作業ディレクトリに作成されます。git checkout-indexこの点に関して特別なことは何もありません。同じことが当てはまりますmkdir '~/dest'そうしないでください!)。引用が必要なファイル名(たとえば、スペースが含まれている)を回避するもう1つの理由:-)
Matt Wallis

254

git archive リモートリポジトリでも動作します。

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master | tar -xf -

リポジトリ内の特定のパスをエクスポートするには、gitへの最後の引数として必要な数のパスを追加します。例:

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv

6
これは私が一番好きなオプションです。これには、ベアリポジトリでも動作するという追加の利点があります。
innM 2009

5
改善されたバージョンは次のとおりです git archive --format=tar --prefix=PROJECT_NAME/ --remote=USER@SERVER:PROJECT_NAME.git master | tar -xf - (アーカイブがフォルダーにあることを確認します)
Nick

7
:サーバーはこの機能を有効にする必要があります。
JakubNarębski12年

12
私が試した:git archive --format=zip --output foo.zip --remote=https://github.com/xxx.git masterそして致命的になった:プロトコルでサポートされていない操作。コマンドストリームの予期しない終了。
andyf 2013

7
@andyf GitHubには独自の方法があります:ドキュメントcurl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -ごと
ビショップ14

63

ここに画像の説明を入力してください

リポジトリがGitHubでホストされている場合の特別なケースの回答。

だけを使用してくださいsvn export

私の知る限り、Githubでは許可されていませんarchive --remote。GitHubはsvn互換であり、すべてのgitリポジトリにsvnアクセスできるためsvn export、通常のようにGitHubのURLを少し調整するだけで使用できます。

たとえば、リポジトリ全体をエクスポートするにtrunkは、URLがどのようにmaster(またはプロジェクトのHEADブランチがに設定されていても)置き換えられることに注意してください。

svn export https://github.com/username/repo-name/trunk/

また、単一のファイルまたは特定のパスやフォルダをエクスポートすることもできます。

svn export https://github.com/username/repo-name/trunk/src/lib/folder

jQuery JavaScriptライブラリの

HEADブランチまたはマスター・ブランチが使用して利用できるようになりますtrunk

svn ls https://github.com/jquery/jquery/trunk

HEAD ブランチは以下でアクセスできます/branches/

svn ls https://github.com/jquery/jquery/branches/2.1-stable

すべてのタグ/tags/は同じ方法で下にあります

svn ls https://github.com/jquery/jquery/tags/2.1.3

1
git archivegitプロトコルを使用している限り、GitHubで正常に動作します。URL https://git://に置き換えてください。GitHubがこの非表示の機能を宣伝しない理由はわかりません。
Neil Mayhew 2016年

1
@NeilMayhewそれは私のために動作しません、私は得fatal: The remote end hung up unexpectedlyます。2つの異なるサーバーでjQuery githubリポジトリを試してみました。
アンソニーHatzopoulos

1
あなたが正しい。git config url.<base>.insteadOfリモートリポジトリのキャッシュに使用していたことを忘れていました。したがってfile://、実際にはURL を使用していました。私は疑うgit archive、これまでに仕事ができるgit://、それが実行できるようにする必要があるため、URLのgit-upload-archiveリモートエンドで。sshgithubで許可されていないことを除いて、プロトコルを使用して可能である必要があります(Invalid command: 'git-upload-archive')。
Neil Mayhew

内部でホストされているgitリポジトリでgithubのように動作するローカルサーバーツールを使用する方法はありますか?
クリス、2014年

1
賛成-Gitにこの機能がないことは完全に奇妙で、svnに頼らなければなりません
Jason S

40

Gitマニュアルから:

git-checkout-indexを使用して「ツリー全体をエクスポートする」

プレフィックス機能により、基本的にgit-checkout-indexを「ツリーとしてエクスポート」機能として使用することは簡単になります。目的のツリーをインデックスに読み込んで、次のようにします。

$ git checkout-index --prefix=git-export-dir/ -a


19
混乱は「目的のツリーをインデックスに読み込む」というフレーズだと思います。
davetron5000 2008年

4
あなたは、分岐バーにディレクトリfooのをエクスポートしたい場合、これは可能でしょうgit read-tree bar:foo。そしてgit checkout-index --prefix=export_dir/ -a、その後多分あなたは行う必要がありますgit update-index master
パスカルロジン

1
@JohnWeldon最初にレポのクローンを作成する必要がありますか?もしそうなら、サブディレクトリの「svn export」の全体のポイントはそのサブディレクトリのコピーを直接取得することなので、私はそれを受け入れません。誰かが1GBのGitリポジトリを持っていて、私が欲しいのは10kBのサブディレクトリだけである場合、全部を複製するように要求するのはおかしいです。
ジェイソンS

3
また、@ davetron5000に「目的のツリーをインデックスに読み込みます」というコメントをエコーし​​ますが、それが何を意味するのかわかりません。
ジェイソンS

38

git-checkout-indexこのように使用できる簡単なラッパーを作成しました。

git export ~/the/destination/dir

宛先ディレクトリがすでに存在する場合は、-fまたはを追加する必要があります--force

インストールは簡単です。スクリプトをのどこかにドロップしてPATH、実行可能であることを確認してください。

のgithubリポジトリ git-export


15
このラッパーはプラットフォームに依存しません。/ bin / shに依存しています。したがって、Windowsを使用している場合、このソリューションはおそらく機能しません。
shovavnik 2013

18
ええと、このスクリプトは57行のドキュメンテーション、空白、セットアップ、引数の解析、そして実際に何かを行う1行だけです...
Vladimir Panteleev

36

これは、SVNよりもGitの問題の方が少ないようです。Gitはリポジトリルートに.gitフォルダーのみを配置しますが、SVNは.svnフォルダーをすべてのサブディレクトリに配置します。したがって、「svn export」は再帰的なコマンドラインマジックを回避しますが、Gitでは再帰は必要ありません。


26
SVN 1.7のように、一つだけの.svnフォルダもあります:subversion.apache.org/docs/release-notes/1.7.html#single-db
kostmo

これは、svn exportが削除する追加のビルドファイルを削除しません。したがって、これは間違いなく答えではありません。
ygoe 2014

28

同等のもの

svn export . otherpath

既存のレポの中は

git archive branchname | (cd otherpath; tar x)

同等のもの

svn export url otherpath

です

git archive --remote=url branchname | (cd otherpath; tar x)

1
おかげで、これは私が欠けていたものでした...また、エクスポートのタイムスタンプをチェックするには(ファイルのように保存されません)、使用しgit archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)ます...しかし、タイムスタンプを使用したアーカイブは正確ではないため、以下の例
sdaau 2014

1
:あなたはこのように、代わりにサブシェルのタールのためのCオプションを使用することができます git archive branchname | tar xC otherpath
ジェームズ・ムーア

Ctar のオプションはGNU Tarのみであることを示します。
aredridel 2017年

22

でファイルを除外していない場合は.gitattributes export-ignoregit checkout

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout -f -q

-f
インデックスからパスをチェックアウトするとき、マージされていないエントリで失敗しません。代わりに、マージされていないエントリは無視されます。

そして

-q
冗長を避けます

さらに、SHA1を追加するだけで、SVNのような特定のコミットリビジョンからブランチまたはタグを取得できます(GitのSHA1は、SVNのリビジョン番号に相当します)。

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout 2ef2e1f2de5f3d4f5e87df7d8 -f -q -- ./

/path/to/checkout/空でなければなりません、Gitは任意のファイルを削除しませんが、警告なしに同じ名前のファイルが上書きされます

更新:斬首の問題を回避するため、またはチェックアウトをタグ、ブランチ、またはSHA1でエクスポートに使用するときに作業リポジトリをそのままにするに-- ./は、最後に追加する必要があります。

二重ダッシュ--は、ダッシュの後のすべてがパスまたはファイルであることをgitに伝え、この場合もgit checkout変更しないように伝えますHEAD

例:

このコマンドは、libsディレクトリだけを取得し、そのreadme.txtファイルを正確にコミットします

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout fef2e1f2de5f3d4f5e87df7d8 -f -q -- ./libs ./docs/readme.txt

これはmy_file_2_behind_HEAD.txt頭の後ろに2つのコミットを作成(上書き)しますHEAD^2

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout HEAD^2 -f -q -- ./my_file_2_behind_HEAD.txt

別のブランチのエクスポートを取得するには

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout myotherbranch -f -q -- ./

./リポジトリのルートに関連していることに注意してください


実際、他の多数の賛成投票の中で、これは圧縮なしで最もうまくいき、裸のリポジトリ(ギトリライト)でうまく機能しました。
takeshin 2014年

1
SHA1チェックアウトにより、リポジトリに「首を
突く

実際には@ITGabs、これは「.git」フォルダをダウンロードしません。ダウンロードしたフォルダはgitリポジトリではないため、技術的に「斬首」されません
Fabio Marreco

@FabioMarreco斬首の問題は、エクスポート/ダウンロードされたファイルではなくリポジトリにあります。詳細については、回答を更新しています
user5286776117878

3
これは私にとってはうまくいきました。しかし、最初は「gitリポジトリではありません」というエラーメッセージが表示されました。次に、「/ path / to / repo /」が.gitフォルダーを指す必要があることがわかりました。したがって、これは機能しました:--git-dir = / path / to / repo / .git
philburk '10年

21

私はgit-submodulesを幅広く使用しています。これは私にとってはうまくいきます:

rsync -a ./FROM/ ./TO --exclude='.*'

1
次のように、名前がドットで始まるファイルは見逃しません.htaccessか?
グレッグヒューギル2011

8
良い解決策は、-exclude = '。*'を--exclude = '
。git

18
--exclude-VCSあなたはこのタクトを取るつもりだった場合
足元

./FROM/をリモートリポジトリにすることはできますか?
レジストデザイン

2
参考までに、私ののコピーにrsyncは、引数がとして記載されています--cvs-exclude。さらに、それはまだコピーを超える.gitattributes.gitignore
ライアンRansford

19

gitリポジトリをエクスポートする方法を探しているときに、このページに頻繁にアクセスしました。この質問への私の回答では、svnは集中型のリポジトリアプローチに従っているため、gitと比較してsvn exportが設計上持っている3つのプロパティを考慮しています。

  • すべてのリビジョンをエクスポートしないことで、リモートリポジトリの場所へのトラフィックを最小限に抑えます
  • エクスポートディレクトリにメタ情報は含まれません
  • svnを使用して特定のブランチをエクスポートするには、適切なパスを指定します

    git clone --depth 1 --branch master git://git.somewhere destination_path
    rm -rf destination_path/.git
    

特定のリリースをビルドする場合、たとえば--branch stableまたはのように安定したブランチを複製すると便利です--branch release/0.9


これは、宛先が存在し、空でない場合は機能しません。
2015年

2
一つの本当の答え: それは深さから生じます。このgit archive | tarアプローチは、理想的ではないPOSIX非互換シェル環境(AppVeyorのCMDまたはPowerShellベースのCIなど)には適用できません。このgit checkoutアプローチは、メイン作業ツリーのインデックスを変更しますが、これは恐ろしいことです。このgit checkout-indexアプローチでは、メインの作業ツリーのインデックスを事前に変更する必要があります。これはさらに大変です。従来のgit cloneアプローチでは、履歴を削除する前にリポジトリの履歴全体を複製しますが、これは無駄です。これが残された唯一の健全な解決策です。
セシルカレー

1
ローカルにエクスポートするには、クローン元のGit作業ツリーの絶対パスの前にfile://プロトコル(などgit clone --depth 1 --branch v3.14.15 file:///home/me/src_repo trg_repo)を付ける必要があることに注意してください。そうしない"warning: --depth is ignored in local clones; use file:// instead."と、浅いクローンではなく標準が出力されて実行され、この回答の目的全体が無効になります。サラッド!
セシルカレー

16

これにより、.dotファイルを除いたすべてのコンテンツがコピーされます。これを使用して、GitクローンプロジェクトをWebアプリのgitリポジトリに.gitなしでエクスポートします。

cp -R ./path-to-git-repo / path / to / destination /

単純な古いbashはとてもうまくいきます:)


なぜリモートにプッシュしないのですか?bashよりもさらに単純です。
nurettin 2012年

2
Webアプリケーションの一部であり、その名前がドットで始まるファイルについてはどうですか?:) .htaccessについて考える
Artur

3
中にあるものを無視したい場合もありますが.gitignore、これはそうではありません。
fregante 2015

14

クローンと同じくらい簡単で、次に.gitフォルダーを削除します。

git clone url_of_your_repo path_to_export && rm -rf path_to_export/.git


4
正直に言えば、これも質問の#1であるこの答えは、99%の確率で実行することです。これらの回答のほとんどは、非常に複雑です。
Geoff Nixon

11

GitHubユーザーの場合、エクスポートURLはエフェメラルであるため、git archive --remoteメソッドは直接機能しません。GitHubにURLを要求してから、そのURLをダウンロードする必要があります。 それが簡単になります:curl

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -

これにより、ローカルディレクトリにエクスポートされたコードが提供されます。例:

$ curl -L https://api.github.com/repos/jpic/bashworks/tarball | tar xzf -
$ ls jpic-bashworks-34f4441/
break  conf  docs  hack  LICENSE  mlog  module  mpd  mtests  os  README.rst  remote  todo  vcs  vps  wepcrack

編集
コードを特定の既存のディレクトリに配置したい場合(githubからのランダムなディレクトリではなく):

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | \
tar xzC /path/you/want --strip 1

11

はい、これはgitをアーカイブに含めずにコードをアーカイブするためのクリーンできちんとしたコマンドであり、gitのコミット履歴を気にせずにパススルーするのに適しています。

git archive --format zip --output /full/path/to/zipfile.zip master 

これは素晴らしいです。あとでgitignoreを削除するだけで、完了して共有する準備が整います。
Sogger 2016年

.gitgnoreなどの削除を受け入れ答えのコメントに記載されている:使用ファイルを.gitattributes、参照feeding.cloud.geek.nz/posts/excluding-files-from-git-archive
Sogger

10

あなたがそうである場合、私はそれを指摘したいだけです

  1. リポジトリのサブフォルダをエクスポートする(それが私がSVNエクスポート機能を使用する方法でした)
  2. そのフォルダから展開先にすべてをコピーしても問題ありません
  3. すでにリポジトリ全体のコピーが整っているので。

次にcp foo [destination]、上記の代わりに使用できますgit-archive master foo | -x -C [destination]


9

コミット時にリモートリポジトリをzipファイルとしてアーカイブできます。

git archive --format=zip --output=archive.zip --remote=USERNAME@HOSTNAME:PROJECTNAME.git HASHOFGITCOMMIT

8

git-exportのbash実装。

「git-archive」実装でそれらを再利用することを目的として、.emptyファイルの作成および削除プロセスを独自の機能に分割しました(後で掲載します)。

ターゲットのエクスポートフォルダーから不要なファイルを削除するために、プロセスに「.gitattributes」ファイルも追加しました。「git-export」機能をより効率的にしながら、プロセスに冗長性を含めました。

EMPTY_FILE = "。empty";

function create_empty () {
## Processing path (target-dir):
    TRG_PATH="${1}";
## Component(s):
    EXCLUDE_DIR=".git";
echo -en "\nAdding '${EMPTY_FILE}' files to empty folder(s): ...";
    find ${TRG_PATH} -not -path "*/${EXCLUDE_DIR}/*" -type d -empty -exec touch {}/${EMPTY_FILE} \;
#echo "done.";
## Purging SRC/TRG_DIRs variable(s):
    unset TRG_PATH EMPTY_FILE EXCLUDE_DIR;
    return 0;
  }

declare -a GIT_EXCLUDE;
function load_exclude () {
    SRC_PATH="${1}";
    ITEMS=0; while read LINE; do
#      echo -e "Line [${ITEMS}]: '${LINE%%\ *}'";
      GIT_EXCLUDE[((ITEMS++))]=${LINE%%\ *};
    done < ${SRC_PATH}/.gitattributes;
    GIT_EXCLUDE[${ITEMS}]="${EMPTY_FILE}";
## Purging variable(s):
    unset SRC_PATH ITEMS;
    return 0;
  }

function purge_empty () {
## Processing path (Source/Target-dir):
    SRC_PATH="${1}";
    TRG_PATH="${2}";
echo -e "\nPurging Git-Specific component(s): ... ";
    find ${SRC_PATH} -type f -name ${EMPTY_FILE} -exec /bin/rm '{}' \;
    for xRULE in ${GIT_EXCLUDE[@]}; do
echo -en "    '${TRG_PATH}/{${xRULE}}' files ... ";
      find ${TRG_PATH} -type f -name "${xRULE}" -exec /bin/rm -rf '{}' \;
echo "done.'";
    done;
echo -e "done.\n"
## Purging SRC/TRG_PATHs variable(s):
    unset SRC_PATH; unset TRG_PATH;
    return 0;
  }

function git-export () {
    TRG_DIR="${1}"; SRC_DIR="${2}";
    if [ -z "${SRC_DIR}" ]; then SRC_DIR="${PWD}"; fi
    load_exclude "${SRC_DIR}";
## Dynamically added '.empty' files to the Git-Structure:
    create_empty "${SRC_DIR}";
    GIT_COMMIT="Including '${EMPTY_FILE}' files into Git-Index container."; #echo -e "\n${GIT_COMMIT}";
    git add .; git commit --quiet --all --verbose --message "${GIT_COMMIT}";
    if [ "${?}" -eq 0 ]; then echo " done."; fi
    /bin/rm -rf ${TRG_DIR} && mkdir -p "${TRG_DIR}";
echo -en "\nChecking-Out Index component(s): ... ";
    git checkout-index --prefix=${TRG_DIR}/ -q -f -a
## Reset: --mixed = reset HEAD and index:
    if [ "${?}" -eq 0 ]; then
echo "done."; echo -en "Resetting HEAD and Index: ... ";
        git reset --soft HEAD^;
        if [ "${?}" -eq 0 ]; then
echo "done.";
## Purging Git-specific components and '.empty' files from Target-Dir:
            purge_empty "${SRC_DIR}" "${TRG_DIR}"
          else echo "failed.";
        fi
## Archiving exported-content:
echo -en "Archiving Checked-Out component(s): ... ";
        if [ -f "${TRG_DIR}.tgz" ]; then /bin/rm ${TRG_DIR}.tgz; fi
        cd ${TRG_DIR} && tar -czf ${TRG_DIR}.tgz ./; cd ${SRC_DIR}
echo "done.";
## Listing *.tgz file attributes:
## Warning: Un-TAR this file to a specific directory:
        ls -al ${TRG_DIR}.tgz
      else echo "failed.";
    fi
## Purgin all references to Un-Staged File(s):
   git reset HEAD;
## Purging SRC/TRG_DIRs variable(s):
    unset SRC_DIR; unset TRG_DIR;
    echo "";
    return 0;
  }

出力:

$ git-export /tmp/rel-1.0.0

「.empty」ファイルを空のフォルダに追加しています... ...完了しました。

チェックアウトインデックスコンポーネント:...完了。

ヘッドとインデックスのリセット:...完了。

Git固有のコンポーネントのパージ:...

'/tmp/rel-1.0.0/{.buildpath}'ファイル...完了しました。 '

'/tmp/rel-1.0.0/{.project}'ファイル...完了しました。 '

'/tmp/rel-1.0.0/{.gitignore}'ファイル...完了しました。 '

'/tmp/rel-1.0.0/{.git}'ファイル...完了しました。 '

'/tmp/rel-1.0.0/{.gitattributes}'ファイル...完了しました。 '

'/tmp/rel-1.0.0/{*.mno}'ファイル...完了しました。 '

'/tmp/rel-1.0.0/{*~}'ファイル...完了しました。 '

'/tmp/rel-1.0.0/{.*~}'ファイル...完了しました。 '

'/tmp/rel-1.0.0/{*.swp}'ファイル...完了しました。 '

'/tmp/rel-1.0.0/{*.swo}'ファイル...完了しました。 '

'/tmp/rel-1.0.0/{.DS_Store}'ファイル...完了しました。 '

'/tmp/rel-1.0.0/{.settings}'ファイル...完了しました。 '

'/tmp/rel-1.0.0/{.empty}'ファイル...完了しました。 '

完了しました。

チェックアウト済みコンポーネントのアーカイブ:...完了。

-rw-r--r-- 1つの管理ホイール25445901 3 Nov 12:57 /tmp/rel-1.0.0.tgz

これで、「git archive」機能を、「create_empty」機能とその他の機能を利用する単一のプロセスに組み込みました。

function git-archive () {
    PREFIX="${1}"; ## sudo mkdir -p ${PREFIX}
    REPO_PATH="`echo "${2}"|awk -F: '{print $1}'`";
    RELEASE="`echo "${2}"|awk -F: '{print $2}'`";
    USER_PATH="${PWD}";
echo "$PREFIX $REPO_PATH $RELEASE $USER_PATH";
## Dynamically added '.empty' files to the Git-Structure:
    cd "${REPO_PATH}"; populate_empty .; echo -en "\n";
#    git archive --prefix=git-1.4.0/ -o git-1.4.0.tar.gz v1.4.0
# e.g.: git-archive /var/www/htdocs /repos/domain.name/website:rel-1.0.0 --explode
    OUTPUT_FILE="${USER_PATH}/${RELEASE}.tar.gz";
    git archive --verbose --prefix=${PREFIX}/ -o ${OUTPUT_FILE} ${RELEASE}
    cd "${USER_PATH}";
    if [[ "${3}" =~ [--explode] ]]; then
      if [ -d "./${RELEASE}" ]; then /bin/rm -rf "./${RELEASE}"; fi
      mkdir -p ./${RELEASE}; tar -xzf "${OUTPUT_FILE}" -C ./${RELEASE}
    fi
## Purging SRC/TRG_DIRs variable(s):
    unset PREFIX REPO_PATH RELEASE USER_PATH OUTPUT_FILE;
    return 0;
  }

使用法:git-archive [/ var / www / htdocs] /repos/web.domain/website:rel-1.0.0
tocororo

8

サブモジュールで動作するものが必要な場合、これは一見の価値があります。

注意:

  • MASTER_DIR =サブモジュールもチェックアウトされたチェックアウト
  • DEST_DIR =このエクスポートが終了する場所
  • あなたがrsyncを持っているなら、私はあなたがより少ないボールの痛みで同じことをすることができると思います。

仮定:

  • これをMASTER_DIRの親ディレクトリ(つまり、MASTER_DIR cd ..)から実行する必要があります。
  • DEST_DIRは作成済みであると見なされます。これは、必要に応じてDEST_DIRの作成を含めるように変更するのはかなり簡単です。

cd MASTER_DIR && tar -zcvf ../DEST_DIR/export.tar.gz --exclude = '。git *'。&& cd ../DEST_DIR/ && tar xvfz export.tar.gz && rm export.tar.gz


6

私の好みは、実際には、Makefile(または他のビルドシステム)にdistターゲットを置き、コードの配布可能なアーカイブ(.tar.bz2、.zip、.jar、または適切なもの)をエクスポートすることです。もしあなたがたまたまGNU autotoolsかPerlのMakeMakerシステムを使っているなら、これはあなたのために自動的に存在すると思います。そうでない場合は、追加することを強くお勧めします。

ETA(2012-09-06):うわー、厳しい投票。ソースコード管理ツールではなく、ビルドツールを使用してディストリビューションをビルドする方が良いと私はまだ信じています。ビルドツールを使用してアーティファクトを構築すると思います。私の現在の仕事では、主な製品はantターゲットを使用して構築されています。私たちはソースコード管理システムの切り替えの最中であり、このantターゲットの存在は移行の手間を1つ減らすことを意味します。


私が考えていたプロジェクトはコードプロジェクトではありません。それはたまたまウェブサイトプロジェクトの線に沿ったものです。
グレッグ・ヒューギル

質問に対応していません。
アンドリューフェリアー2012

1
ええ、そのような答えは誰のニーズにも合わないかもしれませんが、反対票は奇妙です。これ完全に有効な答えであり、実際、多くのシナリオで唯一正しい答えです。これは、この問題を「vcツールの問題」と考えることが、多くの場合、完全に間違った道をたどっているという非常に有効なポイントになります。
snogglethorpe 2013

6

これにより、コミット(CからG)の範囲のファイルがtarファイルにコピーされます。注:これはコミットされたファイルのみを取得します。リポジトリ全体ではありません。ここから少し変更

コミット履歴の例

A-> B-> C-> D-> E-> F-> G- > H-> I

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT C~..G | xargs tar -rf myTarFile.tar

git-diff-treeマニュアルページ

-r->サブツリーに再帰します

--no-commit-id-> git diff-treeは、該当する場合、コミットIDの行を出力します。このフラグは、コミットID出力を抑​​制しました。

--name-only->変更されたファイルの名前のみを表示します。

--diff-filter = ACMRT->これらのファイルのみを選択します。ファイルの完全なリストについては、こちらをご覧ください

C..G->この範囲のコミットのファイル

C〜->コミットCのファイルをインクルードします。コミットC以降のファイルだけではありません。

| xargs tar -rf myTarFile-> tarへの出力


5

私の質問を理解しているように、ローカルリポジトリから状態を抽出するのではなく、履歴や他のブランチのデータなしで、サーバーから特定の状態のみをダウンロードすることが重要です(ここで多くのアンサーが行うように)。

これは次のようにして行うことができます:

git clone -b someBranch --depth 1 --single-branch git://somewhere.com/repo.git \
&& rm -rf repo/.git/
  • --single-branch Git 1.7.10(2012年4月)以降で使用できます。
  • --depth報告された問題はありましたか?

注:anwsersが2ページあることに気づきました。投稿する前に1ページしか見ていません。同様のanwserが1つだけ--depthあります。これは、が指定されてい--single-branchない限り--no-single-branch、これはおそらく同じ効果があることを意味します。確かではありませんが、一部の専門家が確認することがありますか?
OndraŽižka

4

デプロイスクリプトにこれが必要でしたが、上記の方法を使用できませんでした。代わりに、私は別の解決策を見つけました:

#!/bin/sh
[ $# -eq 2 ] || echo "USAGE $0 REPOSITORY DESTINATION" && exit 1
REPOSITORY=$1
DESTINATION=$2
TMPNAME="/tmp/$(basename $REPOSITORY).$$"
git clone $REPOSITORY $TMPNAME
rm -rf $TMPNAME/.git
mkdir -p $DESTINATION
cp -r $TMPNAME/* $DESTINATION
rm -rf $TMPNAME

読み取りツリー/チェックアウトインデックスまたはアーカイブソリューションの問題は何でしたか?私が知る限り、あなたは何かの同等のことをしましたmkdir -p "$2" && git --git-dir="$1" archive HEAD | tar -x -C "$2"が、やや長い曲がりました。
CBベイリー

1
読み取りツリーをリモートリポジトリから動作させることができず、アーカイブソリューションはgithubでは動作しません。
troelskn 2009

はい、アーカイブは無効なコマンドを取得します: 'git-upload-archive' ...エラーが発生し、core.gitProxy構成オプションとGIT_PROXY_COMMAND環境変数が設定されてい
ません

4

簡単な方法で行うと、これは.bash_profileの関数です。現在の場所でアーカイブを直接解凍し、最初に通常の[url:path]を設定します。注:この機能を使用すると、クローン操作を回避でき、リモートリポジトリから直接取得されます。

gitss() {
    URL=[url:path]

    TMPFILE="`/bin/tempfile`"
    if [ "$1" = "" ]; then
        echo -e "Use: gitss repo [tree/commit]\n"
        return
    fi
    if [ "$2" = "" ]; then
        TREEISH="HEAD"
    else
        TREEISH="$2"
    fi
    echo "Getting $1/$TREEISH..."
    git archive --format=zip --remote=$URL/$1 $TREEISH > $TMPFILE && unzip $TMPFILE && echo -e "\nDone\n"
    rm $TMPFILE
}

.gitconfigのエイリアス、同じ構成が必要です(.gitプロジェクト内でコマンドを実行してください、これは常に以前にここ述べたようにベースディレクトリにジャンプしますが、これが修正されるまで私は個人的に機能を好みます)

ss = !env GIT_TMPFILE="`/bin/tempfile`" sh -c 'git archive --format=zip --remote=[url:path]/$1 $2 \ > $GIT_TMPFILE && unzip $GIT_TMPFILE && rm $GIT_TMPFILE' -

4

私がそれを行うために見た中で最も簡単な方法です(そしてWindowsでも動作します)git bundle

git bundle create /some/bundle/path.bundle --all

詳細については、この回答を参照してください:私のgitリポジトリをWindowsマシンからUSBドライブ経由でLinuxマシンにコピーするにどうすればよいですか?


git bundle.gitOPが必要としないフォルダーが含まれます。git archiveより適切な方法のようです
ssc

--allスイッチのドキュメントはどこにありますか?
Garret Wilson

4

エクスポートを作成するマシンにリポジトリのローカルコピーがある場合は、正常に機能する別のソリューションがあります。この場合、このリポジトリディレクトリに移動し、次のコマンドを入力します。

GIT_WORK_TREE=outputdirectory git checkout -f

これは、gitリポジトリでWebサイトを管理していて、クリーンなバージョンをでチェックアウトする場合に特に便利です/var/www/。この場合、このコマンドを.git/hooks/post-receiveスクリプトに追加します(hooks/post-receiveこの状況ではより適切な、ベアリポジトリ上)


3

@Aredridelの投稿が最も近かったと思いますが、それだけではありません。ここに追加します。問題は、svnレポのサブフォルダーにいて、次の場合です。

/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir

次に、svnリビジョン管理下にあるすべてのファイルをエクスポートします(それらは新しく追加された、または変更されたステータスである可能性があります)-そのディレクトリに他の「ジャンク」がある場合(そして.svn、ここではサブフォルダは数えていませんが、.oファイルのような表示されているもの) 、エクスポートされません。SVNリポジトリによって登録されたファイルのみがエクスポートされます。私にとっては、このエクスポートには、まだコミットされていないローカルの変更が含まれているファイルも含まれていることは素晴らしいことです。また、エクスポートされたファイルのタイムスタンプは元のタイムスタンプと同じです。または、svn help exportそれを置くように:

  1. PATH1で指定された作業コピーからクリーンなディレクトリツリーを、リビジョンREVが指定されている場合はそれを、それ以外の場合はWORKINGでPATH2にエクスポートします。... REVが指定されていない場合、すべてのローカル変更が保持されます。バージョン管理されていないファイルはコピーされません。

gitタイムスタンプが保持されないことを理解するには、これらのコマンドの出力を比較します(git選択したリポジトリのサブフォルダー内):

/media/disk/git_svn/subdir$ ls -la .

...そして:

/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)

...そして私は、いずれにしてもgit archive、アーカイブされたファイルのすべてのタイムスタンプが同じになることに気づきます!git help archive言う:

gitアーカイブは、ツリーIDが指定された場合とコミットIDまたはタグIDが指定された場合の動作が異なります。最初のケースでは、現在の時刻がアーカイブ内の各ファイルの変更時刻として使用されます。後者の場合は、参照されたコミットオブジェクトに記録されたコミット時間が代わりに使用されます。

...しかし、どちらの場合も「ファイルの変更時間」を設定しているようです。そのため、これらのファイルの実際のタイムスタンプは保持されません

したがって、タイムスタンプも保持するために、bashスクリプトは次のようになります。これは、多少複雑ではありますが、実際には「ワンライナー」です。そのため、以下では複数行に投稿しています。

/media/disk/git_svn/subdir$ git archive --format=tar master | (tar tf -) | (\
  DEST="/media/diskC/tmp/subdirB"; \
  CWD="$PWD"; \
  while read line; do \
    DN=$(dirname "$line"); BN=$(basename "$line"); \
    SRD="$CWD"; TGD="$DEST"; \
    if [ "$DN" != "." ]; then \
      SRD="$SRD/$DN" ; TGD="$TGD/$DN" ; \
      if [ ! -d "$TGD" ] ; then \
        CMD="mkdir \"$TGD\"; touch -r \"$SRD\" \"$TGD\""; \
        echo "$CMD"; \
        eval "$CMD"; \
      fi; \
    fi; \
    CMD="cp -a \"$SRD/$BN\" \"$TGD/\""; \
    echo "$CMD"; \
    eval "$CMD"; \
    done \
)

「現在の」ディレクトリ(上記/media/disk/git_svn/subdir)のコンテンツをエクスポートすることを前提としています。エクスポート先は不便な場所にありDESTますが、環境変数内にあります。このスクリプトでは、DEST上記のスクリプトを実行する前に、手動でディレクトリを作成する必要があります。

スクリプトが実行された後、比較できるはずです。

ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB   # DEST

...うまくいけば、同じタイムスタンプが表示されます(バージョン管理されていたファイルの場合)。

これが誰かを助けることを願って、
乾杯!


3

プレフィックス(例:ディレクトリ名)を追加しながらzipアーカイブにgitエクスポート:

git archive master --prefix=directoryWithinZip/  --format=zip -o out.zip


1

私は.bashrcファイルに次のユーティリティ関数を持っています:gitリポジトリに現在のブランチのアーカイブを作成します。

function garchive()
{
  if [[ "x$1" == "x-h" || "x$1" == "x" ]]; then
    cat <<EOF
Usage: garchive <archive-name>
create zip archive of the current branch into <archive-name>
EOF
  else
    local oname=$1
    set -x
    local bname=$(git branch | grep -F "*" | sed -e 's#^*##')
    git archive --format zip --output ${oname} ${bname}
    set +x
  fi
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.