推送到特定Git存储库时排除特定文件

时间:2010-03-19 17:07:26

标签: ruby-on-rails git github heroku

使用Git推送到某些存储库时是否可以排除特定文件(* .ai,* .psd)?

我的需求来自于尝试将Git用于版本控制和部署到Heroku。如果我在部署中包含我的图形资源,则slug大小比期望的大。但是,我确实需要在我的主github存储库中包含所有项目文件。

3 个答案:

答案 0 :(得分:12)

解决实际问题的简单方法是在存储库的根目录中创建一个.slugignore文件,该文件列出了不应该包含在slug中的文件。

答案 1 :(得分:4)

您可以维护第二个分支以部署到Heroku,它不包含这些文件,但仍然可以从master合并。 (当然,您必须设计一个系统来解决在修改master中的.ai和.psd文件时遇到的合并冲突。)

您提出的具体问题是不可能的,原因很简单,当您推送时,您将确切的提交从一个存储库传输到另一个存储库,而两个没有相同树的提交根据定义是不同的提交。

提示:最新版本的git为--porcelain提供了git status选项,可以轻松解析“M file1”“DU file2”等信息(由我们修改和取消/删除,分别)。您可以为部署分支编写一个git-merge包装器,它尝试合并,并自动清除预期的冲突:

git checkout deploy
if ! git merge master; then
    git rm $(git status --porcelain | awk '/^DU/ {print $NF}')
fi

(我打印$NF而不是$2的原因是,如果文件重命名,它将看起来像“DU original_name - > new_name”,放在工作树中的副本将是new_name,而不是original_name。)

当然,如果情况如此,脚本可能会变得更复杂 - 你只能查找某些扩展(将它们添加到限制awk模式),甚至可以在perl脚本中捕获整个输出,这样你就可以轻松地做一些更奇特的逻辑...

答案 2 :(得分:3)

没有直接简单的方法可以做到这一点。它肯定是可以管理的,但是有很多痛苦(git不是为了这个而设计的)。

如果您要求Heroku提供一种从部署中排除某些文件的方法,那将会更容易。