GNU tar 不会使用 --exclude-vcs-ignores 忽略 gitignore 中的目录

GNU tar 不会使用 --exclude-vcs-ignores 忽略 gitignore 中的目录

我有一个 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

不幸的是,build/尽管build/在 .gitignore 中指定了该目录,但该目录仍包含在 tar 文件中。

❯ 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

包含 shell 风格的通配模式。适用于`.gitfile'所在目录及其所有子目录。

答案2

如果您只需要排除与文件同一目录中的目录.gitignore,可以在 中添加两条规则.gitignore

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

# - for git
/log/

# - and for the linux shell
./log

这样,git 使用带有前导/且不匹配的条目./

tar另一方面,Shell 工具无法处理前导/,但可以解释./

所以带有该选项的原始命令--exclude-vcs-ignores将起作用。

但有一个问题:

tar仅当您从文件所在的同一目录 运行时,这才有效.gitignore。它不适用于.gitignore以下目录中的其他文件。

相关内容