2009-11-05 9 views
8

gitでコミットまたは一連のコミットから変更されたファイルのみをエクスポート/アーカイブする簡単な方法はありますか?私はこれを行うための明確な指示を見つけることができないようだ(そして私はLinux/Gitを初めて使う)。Gitでのみ変更されたファイルをエクスポート/アーカイブする

私はmsysgitを使用しています。ほとんどの場合、リポジトリ全体を配備するのは問題ありませんが、多くの場合、小さなフィックスを一度にいくつかのファイルに展開する方がはるかに効率的です。

リモートサーバーにgitをプッシュ/プル/インストールすることは、私のアクセスレベルがプロジェクトとクライアントによって異なるため、実際にはオプションではありません。

(ラフな推測)にストレートな方法はあります:

pipe 'diff --names-only' to 'git-archive'? 

答えて

25

私はgitのアーカイブを関与させる必要性はないと思います。 --name-onlyを使用して、ファイルをtarでまとめできます

tar czf new-files.tar.gz `git diff --name-only [diff options]` 

あなたは、Linuxに新しいしているので、これはいくつかの説明が必要になる場合があります。

コマンドラインでバッククォートは、シェルは最初の内のコマンドを実行させますそのコマンドの出力をtarというコマンドラインに置き換えます。したがって、最初にgit diffが実行され、ファイル名のリストが各行に1つずつ生成されます。改行はスペースに畳まれ、ファイルのリスト全体はtarコマンドラインに置かれます。その後、tarを実行して、指定されたアーカイブを作成します。これは非常に長いコマンドラインを生成する可能性があるので、変更されたファイルの数が非常に多い場合は、別の手法が必要になることがあります。

+4

ちょうどposteritiesのために、その別のテクニックは、次のようなものになります: 'git diff --name-only [diff options] | xargs tar -czf files.tar.gz' – jason

+2

'xargs'を使うと、' xargs'は1つのコマンドラインにすべてのファイルを置くにはファイルが多すぎると 'tar'を2回以上実行するため、別の問題があります。これにより、 'tar'は新しい.tarファイルを上書きして、最後のバッチのファイルのみを含むようになります。 –

+0

構文を説明してくれてありがとう! backticksは私が必要なものです:)これは、ファイル名(ウィンドウ...)にスペースがある場合を除いて、msysgitに付属のbashコマンドラインで完全に動作します。それらを自動的にエスケープする方法はありますか? – AKS

関連する問題