GNU tarはgitignoreのディレクトリを無視するために--exclude-vcs-ignoresを使用しません。

GNU tarはgitignoreのディレクトリを無視するために--exclude-vcs-ignoresを使用しません。

私はgitリポジトリを持っていますrsh::

❯ cat rsh/.gitignore
*.o
shell
build/
rsh_history

tar(GNU tar) 1.32 を使用して圧縮しようとしています。

私が使用するコマンドは次のとおりです。

❯ gtar cvaf rsh.tar.gz --exclude-vcs-ignores --exclude-vcs rsh

残念ながら、そのディレクトリは.gitignoreで指定されていますが、build/tarファイルに含まれています。build/

❯ gtar cvaf rsh.tar.gz --exclude-vcs-ignores --exclude-vcs rsh
...
rsh/build/
rsh/build/meson-private/
rsh/build/meson-private/install.dat
rsh/build/meson-private/meson.lock
rsh/build/meson-private/sanitycheckc.exe
rsh/build/meson-private/build.dat
rsh/build/meson-private/sanitycheckc.c
rsh/build/meson-private/cmd_line.txt
rsh/build/meson-private/meson_benchmark_setup.dat
rsh/build/meson-private/meson_test_setup.dat
rsh/build/meson-private/coredata.dat
rsh/build/compile_commands.json
rsh/build/rsh
rsh/build/rsh@exe/
rsh/build/.ninja_deps
rsh/build/build.ninja
rsh/build/meson-logs/
rsh/build/meson-logs/meson-log.txt
rsh/build/meson-info/
rsh/build/meson-info/intro-buildsystem_files.json
rsh/build/meson-info/intro-benchmarks.json
rsh/build/meson-info/intro-buildoptions.json
rsh/build/meson-info/intro-dependencies.json
rsh/build/meson-info/intro-installed.json
rsh/build/meson-info/meson-info.json
rsh/build/meson-info/intro-tests.json
rsh/build/meson-info/intro-projectinfo.json
rsh/build/meson-info/intro-targets.json
rsh/build/.ninja_log
...

奇妙なことに、.gitignore自体は実際には無視されます(--exclude-vcs)。 .gitignore(rsh_history) の他のファイルも無視されます。

答え1

この質問に対するコメントで述べたように、両方がbuild機能します**/build

ただし、これはサブディレクトリでも一致することに注意してください。私が知っている限り(よく知っている人はこの回答を編集してください)、.gitignoreファイルや簡単なコマンドラインオプションでこの問題を解決する方法はありません。 tarはgitの先行スラッシュ構文(たとえば、ルートディレクトリでのみ一致する/build)やインクルード(たとえば)を理解していないためです。build!!but_i_want_this_included/build

これ公式文書説明する:

.gitignore

シェルスタイルのワイルドカードパターンが含まれています。 `.gitfile'が置かれたディレクトリとすべてのサブディレクトリに適用されます。

答え2

ファイルと同じディレクトリにあるディレクトリのみを除外する必要がある場合は、次の.gitignore2つの規則を追加できます.gitignore

#
# exclude log directory in the same directory as .gitignore
#

# - for git
/log/

# - and for the linux shell
./log

このように、gitは先行/項目と一致しない項目を持つ項目を使用します./

tar一方、シェルツールは行間を処理できませんが、/解釈することはできます./

したがって、そのオプションを含む元のコマンドが--exclude-vcs-ignores機能します。

しかし、問題があります。

tarこれは、ファイルがある同じディレクトリで実行している場合にのみ機能します.gitignore.gitignore次のディレクトリの他のファイルでは機能しません。

関連情報