我从未想过重命名一个Git仓库,特别是指包含项目的顶级文件夹会如此困难。是的,项目包含一些子模块,但需要重命名的是 顶级文件夹,而不是 子模块文件夹。Git似乎在其子模块机制中记录了一些奇怪的 绝对路径。
让我们假设:
- 所有项目都位于
/tmp
中。 - 你有一个名为
proj_master
和一个名为proj_mod
的项目。 - 你将
porj_master
克隆为proj_ALL
,然后将prom_mod
克隆为其中的子模块。 - 你将
proj_ALL
重命名为proj_onebillion
。然后黑魔法发生了。
以下步骤将复现我提到的问题。我使用的git版本是:
$ git --version
git version 1.7.9.5
初始化
proj_master
。
$ cd /tmp
$ mkdir proj_master; cd proj_master
$ git init .
$ touch README
$ git add .; git commit -m "hello proj_master"
初始化proj_mod
。
$ cd /tmp
$ mkdir proj_mod; cd proj_mod
$ git init .
$ touch README
$ git add .; git commit -m "hello proj_mod"
将 proj_master
克隆为 proj_ALL
,并将 proj_mod
作为子模块进行克隆。
$ cd /tmp
$ git clone proj_master proj_ALL
$ cd proj_ALL
$ git submodule add /tmp/proj_mod ./mod
$ git add .; git commit -m "hello proj_ALL"
$ git status % Everything is OK.
将proj_ALL
重命名为proj_onebillion
。遇到致命错误。
$ cd /tmp
$ mv proj_ALL proj_onebillion
$ cd proj_onebillion
$ git status
fatal: Not a git repository: /tmp/proj_ALL/.git/modules/mod
注意,子模块目录中有一个名为.git
的文件。$ cat /tmp/proj_ALL/mod/.git
gitdir: /tmp/proj_ALL/.git/modules/mod
是的,一个绝对路径。我第一次意识到,Git 了解超出顶层仓库文件夹范围的东西。
就是这样。我再重复一遍,我重命名的是顶层项目文件夹,而不是子模块文件夹。我查看了 schmuck 的问题,他试图重命名子模块文件夹,因此似乎对我的问题没有帮助。
如果我漏掉了应该先读的内容,我表示歉意。对于所有人,欢迎提供任何建议。