我的源代码树包含几个使用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正在过滤的文件?
我也对其他技术持开放态度。
答案 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
正在读取文件的内容 - 并清除其中列出的模式