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

8

在使用Git推送到特定仓库时,是否可以排除特定的文件(*.ai、*.psd)?

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


没有简单的方法来做到这一点。也许这个答案会有所帮助:https://dev59.com/z3E95IYBdhLWcg3wGqEH#2454778 - mckeed
谢谢您的评论。我想我只能找到一个解决方法(hack)来解决这个问题了。 - Kevin Sylvestre
3个回答

12

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


4
您可以维护一个第二个分支,用于部署到Heroku,其中不包含这些文件,但仍然从主分支合并(当然,您需要解决在主分支修改.ai和.psd文件时出现的合并冲突的系统)。
您所询问的特定事项是不可能的,因为当您推送时,您将精确提交从一个存储库传输到另一个存储库,而两个具有不同树的提交在定义上是不同的提交。
提示:git的最新版本具有“--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脚本中捕获整个输出,以便您可以轻松执行一些更高级的逻辑...


我可以为不同的分支拥有单独的排除文件吗? 我需要在本地机器上创建两个项目吗?谢谢。 - Kevin Sylvestre
你不需要两个存储库来处理两个分支——这是使用类似Git的工具的核心好处之一。分支和合并非常容易。而且,是的,你可以为不同的分支设置不同的.gitignore(毕竟它只是存储库中跟踪的文件!),但请记住,gitignore并不适用于已跟踪的文件——它们的作用是帮助你避免提交还未被提交的内容(例如构建对象)。 - Cascabel
啊,好的,我需要在GIT上多做些阅读(我是一名尝试转换的SVN用户)。谢谢你的建议。 - Kevin Sylvestre

3

没有直接简单的方法可以做到这一点。虽然可以管理,但会有很多痛苦(git并不是为此而设计的)。

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


是的,总体上我很喜欢这个托管解决方案,除了那个功能。我会试着给创建者发送一条消息,看看他们是否有任何新功能即将推出。 - Kevin Sylvestre
根据John Topley的回答,似乎这已经是可能的了。 - hasen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接