使用 Git 推送到某些存储库时是否可以排除特定文件(*.ai、*.psd)?
我的需求来自尝试使用 Git 进行版本控制和部署到Heroku。如果我在部署中包含我的图形资产,则 slug 大小比预期的要大。但是,我确实需要在我的主github存储库中包含所有项目文件。
解决实际问题的简单方法是.slugignore
在存储库的根目录中创建一个文件,列出不应打包在 slug 中的文件。
您可以维护第二个分支以部署到 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
(我打印的原因是,如果文件被重命名,它将看起来像“DU original_name -> new_name”,并且放置在工作树中的副本将是 new_name,而不是 original_name。$NF
)$2
当然,如果您的情况是,脚本可能会变得更复杂 - 您可以只寻找某些扩展(将它们添加到限制 awk 模式),甚至可以在 perl 脚本中捕获整个输出,以便您可以轻松地做一些更花哨的逻辑...
没有直接简单的方法可以做到这一点。这当然是可以管理的,但有很多痛苦(git 不是为此而设计的)。
如果您要求 Heroku 提供一种从部署中排除某些文件的方法,可能会更容易。