无法使用子模块从分支机构检出主分支

时间:2014-06-06 21:57:59

标签: git git-submodules

我的仓库中有一个目录(称之为blah),其中包含我从另一个仓库(repo-blah)手动复制的一些文件。有一天,我决定变聪明,并将这个blah目录作为子模块,这样我就不必在repo-blah更改文件时手动重新复制文件,这样我就可以进行更改我的仓库中的那些文件,并有一个更新repo-blah的gitish方式。

我一直在使用master分支,所以我创建了一个名为sub-blah-branch的分支,在那里我从索引中删除了blah目录:

$ git rm -r blah

然后为它创建一个子模块:

$ git submodule add uri/to/repo-blah blah

我承诺一切,并确保回购清洁:

$ git status
# On branch sub-blah-branch
nothing to commit (working directory clean)

然后,虽然对所有这些子模块的东西感觉非常酷,但我尝试检查主分支。但我明白了:

$ git checkout master
error: The following untracked working tree files would be overwritten by checkout:
    blah/[every file that I had manually copied from repo-blah]
Please move or remove them before you can switch branches.
Aborting

Pro Git's chapter on submodules告诉我,当从已创建子模块的分支切换时,这些子模块的内容不会自动删除,而是在repo切换分支后变为未跟踪。在这种情况下,我无法首先在master目录中执行rm -rf切换到blah

有没有更好的方法来解决这个问题?

我正在使用git版本1.7.9.5

1 个答案:

答案 0 :(得分:5)

考虑到这些文件是:

,这似乎是预期的
  • master
  • 中进行了跟踪
  • 作为sub-blah-branch
  • 中的子模块(索引中的gitlink entry)进行了不同的跟踪

因此,当您切换回master时,git会尝试从索引中删除子模块条目(blah/文件夹),但由于您没有未跟踪的文件,因此无法删除该文件。

您有多种方式可以继续(在“error: The following untracked working tree files would be overwritten by checkout - git”中)

但我会建议:

  • 管理两个克隆,每个克隆在不同的分支上。
  • 或确保blah中没有任何master文件夹。
  • 或直接在blah而非另一个分支中制作master子模块

顺便说一下,确保在声明子模块后正确初始化子模块:

git submodule update --init

如果你愿意,不要忘记你可以让子模块跟随上游回购的一个分支:
见“Git submodules: Specify a branch/tag”。