git diffを使用してデプロイ用のファイルリストを作成する際の問題
-
03-07-2019 - |
質問
次のコマンドのようなものを使用して、展開する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を使用することをお勧めします。