没有Git元数据的Tarballing

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

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

这是我的:

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

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

我也接受其他技术。

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

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

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

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

 --exclude-vcs: Exclude version control system directories 

例如:

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

它适用于Git。

尝试这样的事情:

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

将你的.log文件和其他你不想打包的东西加到你的.gitignore文件中。

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

tar --exclude-vcs

这将排除svn,git元文件等

[巴掌] Bah! 要查找的参数是错误的顺序! 我没有看到警告,因为他们从屏幕上嗖嗖起来。 这允许'。' 通过egrep,导致焦油沾上一切。

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

这工作:

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

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

你可以做到这一点,没有grep。 发现是强大的

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

git-archive可能是你正在寻找的东西。

为了从app目录之外完成它:

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

对我而言, .gitignore内容就是我所需要的:

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

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