57

我的源代码树包含几个使用 Git 源代码控制的目录,我需要压缩整个树,不包括对 Git 元数据或自定义日志文件的任何引用。

我以为我可以使用 find/egrep/xargs/tar 的组合,但不知何故,tar 文件包含 .git 目录和 *.log 文件。

这就是我所拥有的:

find -type f . | egrep -v '\.git|\.log' | xargs tar rvf ~/app.tar

有人可以在这里解释我的误解吗?为什么 tar 处理 find 和 egrep 正在过滤的文件?

我也对其他技术持开放态度。

4

10 回答 10

104

当文件数量增加到多个xargs命令时,您会得到一个令人讨厌的惊喜:然后您将首先制作第一个文件的 tar 文件,然后用其余文件覆盖相同的 tar 文件。

GNUtar有一个--exclude选项可以解决这个问题:

tar cvf ~/app.tar --exclude .git --exclude "*.log" .
于 2010-06-18T21:47:19.820 回答
57

您可以直接尝试使用 tar 选项 --exclude-vcs:

--exclude-vcs:
          Exclude version control system directories

例如:

tar cvfj nameoffile.tar.bz2 directory/ --exclude-vcs

它适用于 Git。

于 2013-02-20T21:49:39.367 回答
15

尝试这样的事情:

git archive --format=tar -o ~/tarball.tar -v HEAD

将您的 .log 文件和您不想打包到 .gitignore 文件中的所有其他内容添加到您的 .gitignore 文件中。

于 2010-06-18T12:36:14.453 回答
12

排除版本控制系统目录:

tar --exclude-vcs

这将排除 svn、git 元文件等。

于 2012-07-10T01:01:44.117 回答
4

[耳光] 呸!要查找的参数顺序错误!我没有看到警告,因为它们从屏幕上消失了。这允许'。通过 egrep 导致 tar 吞下一切。

这将教会我在详细调试中淹没重要消息。

这有效:

find . -type f | egrep -v '\.git|\.log' | xargs tar cvf ~/app.tar
于 2010-06-18T12:36:33.093 回答
4

较新的 GNU tar 可以使用标志 --exclude-vcs 自动排除版本控制目录。这也将处理 .git。

于 2016-01-08T16:58:38.413 回答
2

git-archive可能是您正在寻找的。

于 2010-06-18T12:29:44.393 回答
2

你可以在没有 grep 的情况下做到这一点。find 很强大

 find . -type f -not \( -iname ".git" -or -iname ".log" \) | xargs ...
于 2010-06-18T12:33:32.943 回答
1

从应用程序目录之外执行此操作:

tar cvfz app.tar.gz --exclude ".git/*" --exclude ".git" app/
于 2012-11-01T06:49:16.090 回答
0

对我来说,.gitignore内容就是我需要的:

tar cvfz $PROJECT.tar.gz --exclude-from=$PROJECT/.gitignore $PROJECT

--exclude-from正在读取文件的内容 - 并排除那里列出的模式

于 2017-08-19T09:10:18.440 回答