2017-01-05 8 views
10

は、だから私は、特定から始まるすべてのファイルをエクスポートする(以降のコミットを含むことができる)今日までのIDをコミット今日までコミット:Gitのエクスポートファイルには、私はこれをやっている、

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commitId | xargs tar -rf output.tar

しかし、ID($commitId)をコミット指定で変更されたファイルのみを出力ようです。私も探しています何

は、指定された(時間の経過中に発生した可能性の更なるコミットを含む)は、今日までにIDをコミットから始まるすべてのファイルをエクスポートする必要があるということです。 Git documentationから引用

+1

は、あなたが欲しいものをより詳細に指定してもらえますか? *現在のバージョン*のアーカイブ*(1)、*すべてのバージョン*の*すべてのファイル*(2)、*特定のコミット以降の*すべてのファイル*特定のコミット以降* *変更されたファイルのすべてのバージョンを特定のコミット以降*(すべてのファイルではない可能性がある)*変更、または(4)*されているファイル*(すべてのファイルではないかもしれませんか)? – mkrieger1

+0

あなたが(使用したい[ 'gitのbundle'](https://git-scm.com/docs/git-bundle)または[' Gitのarchive']もhttps://git-scm.com/docs/git -アーカイブ)。 – mkrieger1

答えて

3

のgit diffの木 - 2つの ツリーが

オブジェクトを経由してあったら...見つけ

をブロブの内容とモードを比較コミットはその親と比較されます(下記の--stdinを参照)。

あなたのケースでは<tree-ish>の1つに$commitIdの親と比較されます。代わりに、2つの比較を行うために2つの値を指定する必要があります。コミットを仮定し

はmasterブランチ上にあり、マスターブランチは完全に最新です。そうでない場合は${commitId}の変化がカウントされないだろう、

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT ${commitId}~1 master | xargs tar -rf output.tar 

~1${commitId}後にそう${commitId}の親との比較を相対的に作るされています。そして、次のコマンドは、あなたが望むものを与える必要があります。

5
git diff -z --name-only --diff-filter ACMRT ${commitId}~ HEAD | xargs -0 tar -rf output.tar 
  1. git diff十分です。コミット範囲内の変更されたファイル名のリストを見つけるのに、git diff-treeを使用する必要はありません。
  2. -0xargsに設定すると、出力フィールドターミネータはNULになります。そうしないと、パス/ファイル名にスペースが含まれていると、コマンドが中断します。
  3. ${commitId}~ HEADには、親コミット${commitId}(そのコミットの変更が含まれているため)と最新のコミット(HEAD)の間の変更が記載されています。
+0

これはあなたの解決策です。代わりに$ {commitId}〜1を使用したいと思います。なぜなら、それがより明確になるからです。でも、それは同じことです。 この解決策の素晴らしい点は、ファイルが変更されてから修正された場合(後続のコミットで元に戻す編集)、最終的なtarから省略されることです。 :-) –

関連する問題