![GNU tar 不会使用 --exclude-vcs-ignores 忽略 gitignore 中的目录](https://linux22.com/image/159483/GNU%20tar%20%E4%B8%8D%E4%BC%9A%E4%BD%BF%E7%94%A8%20--exclude-vcs-ignores%20%E5%BF%BD%E7%95%A5%20gitignore%20%E4%B8%AD%E7%9A%84%E7%9B%AE%E5%BD%95.png)
我有一个 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
以下目录中的其他文件。