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

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

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

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

  • 关于Slugignore的Heroku文档

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

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

提示:最新版本的git具有git status--porcelain选项,可以轻松解析“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脚本中捕获整个输出,这样你就可以轻松地做一些更奇特的逻辑…

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

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