2

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

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

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

ただし、出力でスペースを自動エスケープできるようにする必要があるため、tar はスペースを含むファイルについて文句を言わず、tar が作成されると、すべてのファイルに重複した「隠しファイル」があります。 「.」が前に付く ls -al では表示されません。これらは、kch で指摘されている OSX 固有のメタファイルです。

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

4

6 に答える 6

4

私はsedで次の解決策に落ち着きました。

tar cjf ~/deploy.tar.bz2 \
`git diff --name-only 0abc 1def|sed -e "s/ /\\\ /g"`
于 2009-03-02T01:44:56.197 に答える
3

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

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

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

于 2009-03-02T01:31:44.183 に答える
2

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

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

ファイル名のスペースやタブ、または単一引用符、逆引用符、またはバックスラッシュに問題はありません (ファイル名に単一引用符 "'" を使用すると解決策に問題があると思います)。IFS ソリューションと同様に、ファイル名の改行に問題がある可能性があります。

于 2009-03-02T14:50:28.680 に答える
0

あなたが試すことができます

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つしかないことに注意してください。

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

于 2009-03-01T22:15:22.940 に答える
0

サイズが問題にならない場合は、git archiveを使用できます。

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

于 2009-03-01T21:10:07.153 に答える
0

ファイル名のスペースのエスケープを回避する、より洗練された別のソリューションを次に示します。

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

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

于 2009-03-02T08:04:25.190 に答える