質問

次のコマンドのようなものを使用して、展開するtarballを作成します。

tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`

内側のgit diffコマンドは、個別に実行すると、相対パスを含む相対ファイルのリストを生成します。

2つの問題に直面していますが、出力内のスペースを自動エスケープできる必要があるため、tarはスペースを含むファイルについて不平を言いません、tarが作成されると、すべてのファイルが「。」が前に付いた重複した「隠しファイル」 ls -al では表示されません。これらは、kchで指摘されているOSX固有のメタファイルです。

とにかく、誰もがこれらの問題の解決策を知っていますか、またはこれを簡単にスクリプト化する簡単な方法がありますか?

役に立ちましたか?

解決

sedを使用して次のソリューションを決定しました。

tar cjf ~/deploy.tar.bz2 \
`git diff --name-only 0abc 1def|sed -e "s/ /\\\ /g"`

他のヒント

隠しドットファイル、ドットアンダースコアファイルですか?

ファイル foo に別の ._ foo があり、Macを使用している場合、ドットアンダースコアファイルはファイルリソースフォーク/メタデータが保持される場所です。

gitの出力については、引用のために sed または perl を介してパイプしてみてください。ここでも xargs が役立つと思います。

なぜtarの-files-from = FILE または -T FILE オプションを使用しないのですか?ここで、FILEは標準入力を示すために「-」にすることができます

 git diff --name-only 0abc 1def | tar -T - cjf ~/deploy.tar.bz2

ファイル名のスペースやタブ、シングルクォート、バッククォート、バックスラッシュに問題はないはずです(ファイル名にシングルクォート" '"があると問題があると思います)。 IFSソリューションと同様に、ファイル名の改行に問題がある可能性があります。

サイズが重要でない場合は、 git archive を使用できます。

2つのコミットの違いのみを含むtarballを作成できるかどうかわかりません。

試すことができます

eval tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def | while read x; do echo "'""$x""'"; done`

またはsedを使用して同じことを試みるか、

IFS='
' tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`

IFSには改行が1つしかないことに注意してください。

ただし、ファイルの名前に改行が含まれている場合、運命にあります。

これは、ファイル名のスペースをエスケープするのに役立つ、よりエレガントな別のソリューションです

git diff --name-only 0abc 1def | \
    tr '\n' '\0' | \
    xargs -0 tar -rjvf ~/deploy.tar.bz2

jpalecekが指摘したように、" tar -c ..."は実行したくないでしょう。複数回、-rを使用することをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top