没有Git元数据的Tarballing

时间:2010-06-18 12:24:15

标签: find packaging tar xargs grep

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

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

这就是我所拥有的:

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

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

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

10 个答案:

答案 0 :(得分:91)

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

GNU tar有--exclude选项可以解决这个问题:

tar cvf ~/app.tar --exclude .git --exclude "*.log" .

答案 1 :(得分:49)

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

--exclude-vcs:
          Exclude version control system directories

例如:

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

与Git合作。

答案 2 :(得分:12)

尝试这样的事情:

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

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

答案 3 :(得分:11)

要排除版本控制系统目录:

tar --exclude-vcs

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

答案 4 :(得分:4)

[slap]呸!要查找的参数顺序错误!我没有看到警告,因为他们从屏幕上嗖嗖地说。这允许'。'通过egrep,导致焦油淹没一切。

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

这有效:

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

答案 5 :(得分:4)

较新的GNU tar可以选择使用flag --exclude-vcs自动排除版本控制目录。这也将照顾.git。

答案 6 :(得分:2)

git-archive可能就是你要找的东西。

答案 7 :(得分:2)

你可以在没有grep的情况下做到这一点。发现是强大的

 find . -type f -not \( -iname ".git" -or -iname ".log" \) | xargs ...

答案 8 :(得分:1)

从app目录外部进行操作:

tar cvfz app.tar.gz --exclude ".git/*" --exclude ".git" app/

答案 9 :(得分:0)

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

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

--exclude-from正在读取文件的内容 - 并清除其中列出的模式