Git避免推送二进制文件。

3
假设我有一个私有仓库和一个公共仓库。我使用私有仓库进行开发,并在重要的步骤中进行提交,其中保存了所有源代码和二进制文件。保存二进制文件的原因是允许恢复先前提交的版本,而无需重新构建所有二进制文件。
当我完成一个功能的开发后,我将其推送到公共仓库,这个仓库由集成者访问,该集成者获取我的贡献以及其他开发人员的贡献,并将它们全部集成起来。
在拉取所有贡献之后,集成者总是重新构建二进制文件。因此,我不需要从私有仓库推送二进制文件到公共仓库,也不需要集成者拉取它们。
在Git中是否有一种方法可以避免在这种工作流程中推送和拉取二进制文件?
5个回答

1
Fedora项目所做的是拥有一个旁路缓存,其中二进制文件被检入并通过它们的校验和进行识别 -- 如果您不需要这些二进制文件,只需忽略列出校验和及相应文件名的文件即可。

1
一种方法是拥有两个存储库,即源代码存储库和二进制存储库。将源代码存储库作为二进制存储库的子模块进行克隆,以便您可以将特定的源代码修订版本与二进制文件关联起来。

我不是子模块的专家,但它们是否对工作目录施加了特定的结构要求,即它们的文件必须保存在子目录中? - Angelo Borsotti
抱歉,我假设您的构建系统使用单独的源和对象目录。我认为它可以直接构建到二进制存储库的工作目录中,或者您可能可以轻松地将输出复制到那里。 - Neil
在Java中,将源文件和类文件保存在不同的目录中并不是那么简单。 - Angelo Borsotti
你可以尝试使用javac-d参数来更改输出目录。 - Neil

0
简而言之,将二进制文件命名为目录。
.gitignore

这不是一个解决方案,因为 .gitignore 只作用于未跟踪的文件。但是将二进制文件声明为未跟踪意味着在提交时不保存它们。 - Angelo Borsotti

0

我认为你想要的并不是完全可能的。你想要两个远程仓库,但只将二进制文件推送到其中一个,而另一个则永远不会推送。我认为这是不可能的,除非使用特殊命令(带有选项以忽略 .gitignore 文件进行提交)来推送二进制文件。

请查看 .gitignore 功能以忽略提交中的文件(因此也就不会推送)。但这并不完全符合你的要求,因为它将停止所有二进制文件的推送。

请注意,将二进制文件检入 git 可能会导致所有检出更新二进制文件的时间戳(这可能比项目中的其他文件更新,因此增量构建不会重新构建东西,因为许多工具使用文件时间戳来确定需要重新构建什么)。

对你来说问题在于,为了推送任何内容,你必须先提交它。但两个仓库都将看到它们共享和分发的分支的所有提交。

因此,你唯一的解决方法是在本地工作副本(以及私有仓库)中创建一个新分支,该分支仅包含二进制文件的提交。但这需要你付出很多工作和头疼才能解决和实现。

即你需要设置一个工作流程来切换到这个仅包含二进制文件的分支,然后搜索所有二进制文件,生成提交(可能忽略.gitignore或进行编辑),然后推送到私有仓库,然后撤消对仓库所做的任何更改(如果您编辑了它,则恢复旧的.gitgnore),然后切换回仅包含源代码的原始分支。

我的建议是重新考虑为什么需要推送二进制文件。您的项目重建需要花费很多分钟/小时吗?


0

你可以尝试在一个单独的目录中构建二进制文件。然后,你可以将其视为另一个本地仓库,并使你的源代码仓库不受二进制文件的影响。将它们放在本地仓库中并避免将特定文件推送到远程仓库会破坏分布式版本控制系统的目的。


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