代码之家  ›  专栏  ›  技术社区  ›  David Eyk

Git不会初始化/同步/更新新的子模块

  •  84
  • David Eyk  · 技术社区  · 16 年前

    以下是我的部分内容 .gitmodules 文件:

    [submodule "src/static_management"]
            path = src/static_management
            url = git://github.com/eykd/django-static-management.git
    [submodule "external/pyfacebook"]
            path = external/pyfacebook
            url = http://github.com/sciyoshi/pyfacebook.git
    

    然而, .git/config 仅包含第一个:

    [submodule "src/static_management"]
            url = git://github.com/eykd/django-static-management.git
    

    第二个子模块( external/pyfacebook )由另一个开发人员在功能分支中添加。我现在继承了这个开发,并检查了功能分支。但是,Git不会为我拉子模块。我试过了:

    • git submodule init
    • git submodule update
    • git submodule update --init
    • git submodule sync
    • 从中删除所有子模块定义 git/CONFIG 并运行 初始化子模块 . 它只复制以前存在的子模块,而忽略新的子模块。
    • 在中输入新的子模块定义 git/CONFIG 手动和运行 Git子模块更新 . 只有以前存在的子模块需要更新。

    在各种组合中,但Git不会更新 git/CONFIG 基于的新内容 GITS模块 也不会创建 外部/pyfacebook 折叠并拉出子模块的内容。

    我错过了什么?是手动干预(手动添加子模块项到 git/CONFIG )真正需要,为什么?

    编辑: 手动干预不起作用。手动将新的子模块项添加到 git/CONFIG 什么都不做。新的子模块被忽略。

    15 回复  |  直到 7 年前
        1
  •  31
  •   Quickredfox    16 年前

    您最近是否升级到了Git 1.7.0.4版本?我做了,现在也有类似的问题…

    编辑:我解决了我的问题,但完全不知道问题出在哪里。我手动删除了.git/config和.gitmodules中的子模块条目,并用ususal步骤重新添加了我的子模块(git子模块添加等…)。工作窗体,但不向此线程添加任何值。

        2
  •  72
  •   infoclogged    10 年前

    我有同样的问题,.gitmodules文件被提交了,但实际的子模块提交(即子模块的提交ID的记录)却没有。

    手动添加似乎可以实现这一目的-例如:

    git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook
    

    (即使没有从.git/config或.gitmodules中删除任何内容。)

    然后提交它来正确地记录ID。

    在这个工作答案中添加一些进一步的注释:如果git子模块init或git子模块更新不起作用,那么如上所述,git子模块add url应该起作用。你可以核对一下这个

     git config --list
    

    其中一个应该得到一个子模块的条目,您想要在git config--list命令的结果中拉入这个子模块。如果在配置结果中有子模块的条目,那么现在通常的git子模块更新--init应该会拉入子模块。要测试此步骤,可以手动重命名子模块,然后更新子模块。

     mv yourmodulename yourmodulename-temp
     git submodule update --init
    

    为了查明子模块中是否有局部更改,可以通过git status-u(如果要查看子模块中的更改)或git status(忽略子模块)(如果不想查看子模块中的更改)查看。

        3
  •  42
  •   palik    9 年前

    Git版本2.7.4。此命令更新本地代码 git submodule update --init --force --remote

        4
  •  14
  •   Alex Ivasyuv    10 年前

    有同样的问题,当Git忽略 init 和 update 命令,什么也不做。

    如何修复

    1. 您的子模块文件夹应该提交到git repo中。
    2. 不应该在里面。吉特忽略

    如果这一要求得到满足,它将起作用。否则,所有命令都将执行,不会出现任何消息和结果。

    如果你这么做了,但仍然不起作用:

    1. 手动添加子模块,例如 git submodule add git@... path/to
    2. git submodule init
    3. git submodule update
    4. 提交并推送所有文件- .gitmodules 以及您的模块文件夹(注意,文件夹的内容不会提交)
    5. 放弃本地Git回购
    6. 克隆一个新的
    7. 确保 .git/config 还没有任何子模块
    8. 现在, 初始化子模块 -您将看到一条消息,模块已注册
    9. Git子模块更新 -将提取模块
    10. 现在看看 git/CONFIG 你会发现注册的子模块
        5
  •  4
  •   nkav    11 年前

    有点神奇,但今天我跑了 git submodule init 然后 git submodule sync 然后 git submodule update 它开始了 拉我的子模块…魔法?也许!这真的是最 Git_的烦人体验

    搔那个。我实际上是通过 git submodule update --init --recursive . 希望这有帮助。

    ps:确保您在根git目录中,而不是子模块中。

        6
  •  3
  •   Carlo Wood    9 年前

    答案中似乎也有很多困惑。

    git submodule init 是 不 用于在.git/config中(从.gitmodules)神奇地生成内容。它的目的是在克隆父项目之后在一个完全空的子目录中设置一些内容,或者拉一个提交来添加以前不存在的子模块。

    换句话说,你遵循 git clone 对于具有子模块的项目(通过克隆签出.gitmodules文件的事实,您将知道该子模块) git submodule update --init --recursive .

    你做 不 跟随 git submodule add ... 用一个 初始化子模块 (或) git submodule update --init )这不应该奏效。事实上,如果一切正常,这个添加程序已经更新了相应的.git/config。

    编辑

    如果以前不存在的git子模块是由其他人添加的,那么您需要 git pull 对于该提交,那么该子模块的目录将完全为空(当您执行 git submodule status 新子模块的散列应该可见,但将具有 - 在前面)在这种情况下,你需要跟随 GIT拉力 也用 git子模块更新--init (加) --recursive 当它是子模块中的一个子模块时)为了使新的、以前不存在的子模块被签出;就像在一个带有子模块的项目的初始克隆之后一样(很明显,您之前也没有这些子模块)。

        7
  •  2
  •   dirkaholic    14 年前

    根据戴夫·詹姆斯·米勒的回答,我可以确认这对我有用。这里重要的是提交子项目提交ID。只是在.gitmodules中输入条目是不够的。

    下面是一个适当的提交:

    https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae

        8
  •  2
  •   joseph.hainline    13 年前

    我也有同样的问题。

    .gitmodules 有子模块,但在 git submodule init 命令它不在 .git/config .

    原来添加子模块的开发人员也将子模块目录添加到 .gitignore 文件。那不管用。

        9
  •  2
  •   fridh    13 年前

    和你一样,我发现Git子模块同步并不像你期望的那样。 只有在做了一个明确的 git submodule add 再次更改子模块的URL。

    所以,我把这个脚本 ~/bin/git-submodule-sync.rb :

    https://gist.github.com/frimik/5125436

    我还对一些后接收Git部署脚本使用相同的逻辑。

    我现在要做的就是编辑 .gitmodules ,然后运行这个脚本,它最终像我想的那样工作 git submodule sync 本来应该的。

        10
  •  1
  •   cjds    12 年前

    当我今天看到这一点时,一个开发人员将树的一部分移动到了一个新的子目录中,看起来他的Git客户机没有在树中记录更新的子项目规则,相反,它们只是被篡改了,离开了 .gitmodules 指旧位置和当前树中不再存在的子项目。

    将子模块添加回,并将子模块的commit shas与中的commit shas进行比较。 git show $breaking_commit_sha (搜索与regexp匹配的行 ^-Subproject )根据需要调整固定的东西。

        11
  •  1
  •   Eric Jeker    9 年前

    我今天也有同样的问题,因为我打字 git submodule init 然后我把那些线插在我的 .git/config :

    [submodule]
       active = .
    

    我删除了它并键入:

    git submodule update --init --remote
    

    一切都恢复正常了,我的子模块像往常一样在它的子目录中更新。

        12
  •  1
  •   Arvid    9 年前

    我对一个子模块也有类似的问题。它只是不想被克隆/提取/更新/随便什么。

    尝试使用重新添加子模块时 git submodule add git@my-repo.git destination 我得到了以下输出:

    A git directory for 'destination' is found locally with remote(s):
      origin        git@my-repo.git
    If you want to reuse this local git directory instead of cloning again from
      git@my-repo.git
    use the '--force' option. If the local git directory is not the correct repo
    or you are unsure what this means choose another name with the '--name' option.
    

    所以,我试着 强制执行添加命令 :
    git submodule add --force git@my-repo.git destination

    这对我来说很有效。

        13
  •  0
  •   atahan    9 年前

    删除子模块dir及其内容(“external/pyfacebook”文件夹),如果它以前存在 git submodule add ... 可能会解决问题。

        14
  •  0
  •   Marc    8 年前

    备案:
    我通过添加 空存储库 作为子模块。在这种情况下,子模块没有可用的引用哈希,导致了原始海报所描述的错误。

    提交后强制添加存储库解决了问题(如arvids post中所述)
    git submodule add --force git@my-repo.git destination

        15
  •  0
  •   Masoud Darvishian    7 年前
    • 从您的 .git/config
    • 跑 git submodule init 命令
    • 转到子模块目录并运行 git pull origin master

    现在应该可以了