6

我目前正在尝试为我从事了一段时间的项目设置 Git。我确实记得很久以前设置了 Git,但由于各种原因从未使用过它。现在我想使用它,我遇到了一个奇怪的问题,我认为这与旧安装有关。

为了重新开始,我安装了一个新的 Ubuntu 操作系统,这样就不会有 Git 安装,我复制了项目(Grails)。然后我导航到该目录并运行以下命令:

git init

git remote add origin https://USERNAME@bitbucket.org/USERNAME/APPNAME.git

然后我跑了:

git add .

这是我得到以下错误的地方:

fatal: Not a git repository: /home/user/workspace/App_V3/.git/modules/plugins/grails-spring-security-ui

这个错误很奇怪,因为它甚至与我所在的目录不匹配,因为目录如下:

/home/user/Workspace/App_V7/

我在想,最初我可能已经在旧操作系统的 App_V3 文件夹中设置了 Git,但不知道为什么它仍然指向该目录,因为我运行了下面的代码来重新初始化它:

rm -rf .git
git init

有人可以帮我解决这个问题,因为它真的很令人沮丧:S

提前致谢

4

3 回答 3

16

使用子模块移动存储库是有问题的

我在想,最初我可能已经在旧操作系统的 App_V3 文件夹中设置了 Git

这就是问题的根源。

重要的是最初创建存储库(或更具体地说,引用的子模块)时的 git 版本。

考虑一个包含一个子模块的存储库,vendor/awesome创建子模块时 git 的行为是完全不同的。

git 版本 < 1.7.8

的内容vendor/awesome/.git是一个文件夹 - 就像任何 git checkout 一样,例如 checkout 的文件夹结构是:

.gitmodules
.git
    ...
vendor/
    awesome
        .git
            config
            HEAD
            index
            packed-refs
            ...

移动这种存储库没有问题,因为任何地方都没有存储路径。

git 版本 1.7.8 或 1.7.9

1.7.8 移动了一个子模块的 .git 文件夹的位置

当使用“git submodule init”填充新的子模块目录时,子模块的 $GIT_DIR 元信息目录在超级项目的 $GIT_DIR/modules// 目录中创建并通过 gitfile 机制引用。这是为了可以在不重新克隆的情况下在树中具有和不具有子模块的超级项目中的提交之间进行切换。

因此vendor/awesome/.git不是文件夹,而是具有以下内容的文件:

gitdir: /absolute/path/to/main/repo/.git/modules/vendor/awesome

整体文件夹结构为:

.gitmodules
.git
    ...
    modules
        vendor
            awesome
                config
                HEAD
                index
                packed-refs
                ...

vendor/
    awesome
        .git <- a file

的内容.git/modules/vendor/awesome/config指定工作树的位置:

[core]
   ...
   worktree = /absolute/path/to/main/repo/vendor/awesome

这是一个非常棒的变化——但是它引入了一个问题,因为使用绝对路径来引用位置。

git 版本 >= 1.7.10

1.7.10 版本中,修改了子模块中绝对路径的使用

包含由“git submodule”管理的顶级超级项目的整个目录可以移动到另一个地方。

现在vendor/awesome/.git,如果使用此版本或更高版本的 git 生成,将包含:

gitdir: ../../.git/modules/vendor/awesome

的内容.git/modules/vendor/awesome/config指定工作树的位置:

[core]
   ...
   worktree = ../../../../vendor/awesome

再一次,移动这种存储库没有问题,因为路径是相对于主存储库的。

移动存储库

使用旧版本或新版本的 git - 你很好。

如果您不幸在 1.7.8 或 1.7.9 中创建的存储库上工作(从问题中的证据来看似乎就是这种情况)移动存储库 - 有两种解决方案

  1. 再次克隆
  2. 更正子模块 .git 文件中的路径,以及相应的工作树配置设置
于 2013-07-19T13:40:03.293 回答
2

我一次将所有文件移动到一个新文件夹,然后似乎工作正常:)

谢谢您的帮助

于 2013-07-19T13:04:35.587 回答
0

代替

git init
git remote add origin https://USERNAME@bitbucket.org/USERNAME/APPNAME.git

你应该使用

git clone origin https://USERNAME@bitbucket.org/USERNAME/APPNAME.git .

因为您想克隆现有存储库而不是重新创建它。

于 2013-07-19T13:08:30.037 回答