我正在寻找如何处理我的源代码(Web应用程序)所依赖的大型二进制文件的意见.我们目前正在讨论几种选择:
您对此有何体验/想法?
另外:有没有人有多个Git存储库的经验并在一个项目中管理它们?
这些文件是程序的图像,该程序生成包含这些文件的PDF.文件不会经常更改(如年份),但它们与程序非常相关.没有文件,程序将无法运行.
当使用git checkout切换分支时,我会假设您大多数时候都想要更新子模块.
更新了示例:
在分支A上,git checkout B将导致分支B的工作副本,子模块S在3852f1(具有修改的S).git submodule update将在fd72d7结帐S.
有人请帮我理解git中的子模块.我知道他们在互联网上受到了很多抨击但是因为我认为git开发人员是聪明人,所以当前行为必须有理由 - 也许是一种解决我的问题的方法.
所以,我有一个项目和一些子模块.该项目有不同的分支,如:
我的子模块经常不会更新(可能每周一次)所以我很好,他们没有自动附加到子模块库的头部.
但是,当我查看旧分支时 - 因为我需要修复旧版软件中的错误 - 我还需要更新子模块.
为什么我需要这样做?
我希望git像svn一样工作.当我在我的主回购中投入工作时,我希望git能够按照以下思路思考:"好吧,他现在想要完成他的工作.我可以看到子模块目前处于修订版abc所以当他在将来的某个时候回到这个提交,他可能想要再次使用相同版本的子模块."
我不能看到一个案例,当你在主存储库中返回3年时,你希望子模块保持当前版本.但是,这个实施必须有理由,对吧?
我真的很想知道你是否有人知道这背后的想法,但无论如何我真的想要一个解决方案.有没有办法告诉git:"我想用这些子模块提交这项工作.如果我在某个时候回到这种状态,我希望子模块也能在正确的版本中检出."
澄清的例子
我的主存储库是一个需要使用SSL的应用程序,我找到了一个我作为子模块添加的SSL库(libSSL).
2010年10月31日,我在我的主存储库(2fd4e1)中创建了一个提交,而子模块指向了libSSL版本3(c67a2d).
时间过去了,libSSl更新到版本34,我调整我的代码,生活很好.
在2013年5月14日,我创建了一个新的提交(28fced)和子模块指向最新版本的libSSL(849ee1).
但是,如果我查看2fd4e1,即使原始提交是使用c67a2d创建的,我的子模块也将保持在849ee1.Git知道我使用c67a2d进行了原始提交,但我没有看到你怎么可能想要另一个子模块而不是创建原始提交的子模块.
StackOverflow 上提出了很多关于自动更新子模块的问题,包括:
git checkout自动执行git submodule update --recursive?但在我看来,对于 git 子模块,还没有单一的方法可以像svn up关于 svn-externals 一样工作。
所以既然git每天都在变化,我又敢再问:
有没有一种(方便的)方法来初始化和自动更新checkout 和 pull(即merge和rebase)的子模块检出(即与其相应的子模块提交 ID 保持同步)?
目前我有两种方法:
#1: 创建一个post-checkout,post-merge并post-rewrite钩住以下内容
#!/bin/sh
git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)
正如您已经看到的那样,这种方法有几个缺点:
#2: 为pulland配置别名checkout
git config --global alias.up 'pull …Run Code Online (Sandbox Code Playgroud) 我们的小软件商店最近从Subversion迁移到Git,因为我们的程序员更好地发现了Git.迁移并非轻松,我们遇到子模块功能问题.我的主要抱怨是,一旦repo包含子模块,你就不能简单地克隆它并期望它能够正常工作.您必须执行额外的步骤来初始化和下载子模块.后续拉动应该自动更新子模块,这样就可以了.但是当我添加一个新的子模块时,推送提交和人们拉动,他们不会自动获得新的子模块,他们必须git submodule update再次手动.
这是愚蠢的,因为人们不能简单地用子模块拉回购物并期望它的构建.这种理解是否正确?程序员可以简单地编写脚本或别名来在接收新提交后更新子模块,但对于我们的非程序员子模块来说很痛苦.我想提出一个解决方案,无论使用何种Git客户端,克隆/拉动后repo都能正常工作.
我有什么选择?
这个问题有没有办法让git pull自动更新子模块?有一个接受的配置git的答案,如下所示:
git config --global submodule.recurse true
Run Code Online (Sandbox Code Playgroud)
就像对该答案的评论之一,我想知道为什么这不是git的默认行为; 更确切地说,设置此配置选项有哪些缺点?