我们最近从subversion转移到git,然后转到Github,用于几个开源项目。 Github很不错,因为它提供了很多功能。我特别喜欢的一件事是能够将标签下载为zip
或.tar.gz
个文件。
不幸的是,Github最近停止了下载。这应该不是问题,因为能够下载标签。但是在过去,我们没有将Makefile
,configure
脚本或任何其他autoconf生成的文件放入repo中,因为当人们合并时会遇到很多冲突。
处理此问题的正确方法是什么?
bootstrap.sh
文件并告诉人们运行该文件?make dist
并将其放入回购广告?由于
答案 0 :(得分:13)
make dist
的输出
您的第一个选择 - 将Autoconf和Automake生成的文件放入存储库 - 不是一个好主意。对store generated files in source control几乎没有益处。在这种情况下,它将使用许多不必要且可能相互冲突的提交来污染您的历史记录,特别是如果并非所有贡献者都使用相同版本的Autotools。您的第三个选项 - 检查make dist
的输出 - 与第一个选项完全相同的原因是一个坏主意。
您的第二个选项 - 添加一个调用Autoconf和Automake以生成configure
脚本的“bootstrap”脚本 - 也是一个坏主意。这违背了Autotools的全部目的,即使您的源可以跨系统移植 - 包括那些Autotools不可用的系统! (如果有人想在他们没有root访问权限的机器上构建和安装你的软件,以及没有安装GNU Build System的地方会发生什么。一个bootstrap脚本不会帮助他们,因为他们是首先需要进行Autotools的本地安装以及可能的所有依赖项。)
发布使用Autotools的代码的正确方法是生成一个make dist
(或更好,make distcheck
的tarball,因为这也将运行测试并进行其他健全性检查),然后发布这个tarball 除了源存储库之外的某个地方。
您的原始问题,从2013年4月开始,声明GitHub停止下载页面。但是,在2013年7月,GitHub added a "Releases" feature不仅预先打包了源标记,还允许您将任意文件附加到每个版本。所以在GitHub上,你可以在Releases页面上发布你的make dist
tarball (最好还有他们的独立GnuPG签名)。
$ git tag 1.0 # Also use -s if desired
$ git push --tags
$ make dist # Alternatively, 'make distcheck'
如果您不想使用GitHub版本,那么as pointed out in a previous answer,您应该将tarball上传到其他地方,例如您自己的网站或FTP站点。从项目的README.md
添加指向此存储库的链接,以便用户可以找到它。
答案 1 :(得分:5)
第二个更好:您希望您的仓库中的任何用户尽快启动并运行,重新生成他/她为构建您的程序所需的内容。
由于Git是 text 的版本控件(而不是artifact repo like Nexus),因此提供了一种生成最终二进制文件的方法。
答案 2 :(得分:0)
当您剪切版本时,将make distcheck
的结果上传到项目的下载页面:它是一个makefile目标,用于构建tarball并验证它是否安装,卸载,通过测试和其他健全性检查。 Github错误的做法不是借口:在你的回购中创建一个这样的树:
/
/source
/source/configure.ac
/source/Makefile.am
/source/...
/releases
/releases/foo-0.1.tar.gz
/releases/...
对于开发人员,您不应该在源代码管理中生成文件。许多现代自动化项目都可以通过调用autoreconf -i
来自行引导。