相关疑难解决方法(0)

使用Git管理大型二进制文件

我正在寻找如何处理我的源代码(Web应用程序)所依赖的大型二进制文件的意见.我们目前正在讨论几种选择:

  1. 手动复制二进制文件.
    • 亲:不确定.
    • Contra:我强烈反对这一点,因为它增加了在设置新站点/迁移旧站点时出错的可能性.建立另一个障碍.
  2. Git管理所有这些.
    • 专业:删除'忘记'复制重要文件的可能性
    • 反对:膨胀存储库并降低管理代码库和检出,克隆等的灵活性将需要相当长的时间.
  3. 单独的存储库.
    • Pro:检查/克隆源代码的速度很快,图像可以在自己的存储库中正确存档.
    • Contra:删除了在项目中拥有唯一的 Git存储库的简单性.它肯定会介绍一些我没有想过的其他事情.

您对此有何体验/想法?

另外:有没有人有多个Git存储库的经验并在一个项目中管理它们?

这些文件是程序的图像,该程序生成包含这些文件的PDF.文件不会经常更改(如年份),但它们与程序非常相关.没有文件,程序将无法运行.

git version-control binaryfiles large-files

517
推荐指数
10
解决办法
18万
查看次数

为什么git submodule在git checkout上不会自动更新?

当使用git checkout切换分支时,我会假设您大多数时候都想要更新子模块.

  • 在什么情况下你想要的切换后更新子模块?
  • 如果这是由git checkout自动完成会破坏什么?

更新了示例:

  • 分支A的子模块S为3852f1
  • 分支B在fd72d7处具有子模块S.

在分支A上,git checkout B将导致分支B的工作副本,子模块S在3852f1(具有修改的S).git submodule update将在fd72d7结帐S.

git git-submodules

69
推荐指数
2
解决办法
1万
查看次数

为什么`git checkout`不会自动执行`git submodule update --recursive`?

有人请帮我理解git中的子模块.我知道他们在互联网上受到了很多抨击但是因为我认为git开发人员是聪明人,所以当前行为必须有理由 - 也许是一种解决我的问题的方法.

所以,我有一个项目和一些子模块.该项目有不同的分支,如:

  • MyApp_version2
  • MyApp_version3
  • MyApp_version4
  • MyApp_liteversion
  • MyApp_development

我的子模块经常不会更新(可能每周一次)所以我很好,他们没有自动附加到子模块库的头部.

但是,当我查看旧分支时 - 因为我需要修复旧版软件中的错误 - 我还需要更新子模块.

为什么我需要这样做?

我希望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进行了原始提交,但我没有看到你怎么可能想要另一个子模块而不是创建原始提交的子模块.

git git-submodules

34
推荐指数
3
解决办法
1万
查看次数

保持 git 子模块结帐与提交 ID 同步的当今策略?

StackOverflow 上提出了很多关于自动更新子模块的问题,包括:

但在我看来,对于 git 子模块,还没有单一的方法可以像svn up关于 svn-externals 一样工作。

所以既然git每天都在变化,我又敢再问:

有没有一种(方便的)方法来初始化自动更新checkout pull(即mergerebase)的子模块检出(即与其相应的子模块提交 ID 保持同步)?

目前我有两种方法:

#1: 创建一个post-checkout,post-mergepost-rewrite钩住以下内容

#!/bin/sh
git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)

正如您已经看到的那样,这种方法有几个缺点:

  • 它很复杂,可能需要一个脚本才能使其可靠地工作
  • 如果您已经使用这些 git-hooks,则效果不佳
  • 提交挂钩仅在此克隆上处于活动状态(必须由在每个克隆上从事此项目的每个人重新完成)
  • 设置是非标准的,会混淆其他人

#2: 为pulland配置别名checkout

git config --global alias.up 'pull …
Run Code Online (Sandbox Code Playgroud)

git git-pull git-config git-checkout git-submodules

7
推荐指数
1
解决办法
642
查看次数

如何让非程序员更容易使用Git子模块?

我们的小软件商店最近从Subversion迁移到Git,因为我们的程序员更好地发现了Git.迁移并非轻松,我们遇到子模块功能问题.我的主要抱怨是,一旦repo包含子模块,你就不能简单地克隆它并期望它能够正常工作.您必须执行额外的步骤来初始化和下载子模块.后续拉动应该自动更新子模块,这样就可以了.但是当我添加一个新的子模块时,推送提交和人们拉动,他们不会自动获得新的子模块,他们必须git submodule update再次手动.

这是愚蠢的,因为人们不能简单地用子模块拉回购物并期望它的构建.这种理解是否正确?程序员可以简单地编写脚本或别名来在接收新提交后更新子模块,但对于我们的非程序员子模块来说很痛苦.我想提出一个解决方案,无论使用何种Git客户端,克隆/拉动后repo都能正常工作.

我有什么选择?

git git-submodules

6
推荐指数
1
解决办法
1722
查看次数

将git的submodule.recurse配置选项设置为true有什么缺点?

这个问题有没有办法让git pull自动更新子模块?有一个接受的配置git的答案,如下所示:

git config --global submodule.recurse true
Run Code Online (Sandbox Code Playgroud)

就像对该答案的评论之一,我想知道为什么这不是git的默认行为; 更确切地说,设置此配置选项有哪些缺点?

git git-submodules

6
推荐指数
1
解决办法
445
查看次数