没有子模块的嵌套git仓库?

44

在父存储库中包含的git存储库,除非设置为子模块,否则不会包含在父级提交中。是否可以覆盖此行为并将嵌套的git存储库视为任何其他目录?我不想通过子模块依赖外部依赖项,但想要使用git来管理项目内的这些依赖关系。

(Note: "git" and "submodule" are technical terms and should not be translated into Chinese)

我不确定这是否是“管理依赖项”的正确方式,但我提出了两种实现你想要的方法,以及关于Git中子模块性质的一些澄清。 - VonC
1
听起来你真正想要的是子树合并。这将让你得到一个单一的存储库和一个单一的历史记录。 - user597474
你确定父仓库中的Git仓库,除非设置为子模块,否则不会包含在父仓库的提交中吗?因为这正是我想要的,如果你是对的,那么Git已经默认支持这个功能。 - Saeed Neamati
5个回答

8

1/ 您可以通过以下方式覆盖它:

  • 通过git config设置: 设置环境变量$GIT_DIR
    您将嵌套Git工作树的.git目录定义为外部.git目录(外部于嵌套仓库和主仓库)。
  • 或者通过将嵌套仓库'N'设置在主仓库之外,但在主仓库中检出该仓库'N':
core.worktree

设置工作树的根路径。这可以被GIT_WORK_TREE环境变量和--work-tree命令行选项覆盖。

在这两种情况下,想法是拥有一个没有任何.git子目录的嵌套工作树。

2/ 对于子模块,嵌套的git仓库并不真正包含在父仓库中。
在父树中创建了一个特殊条目以记录外部Git SHA1。

new file mode 160000
index 0000000..4c4c5a2

见"Git子模块的性质"(答案的第三部分)


九年后,这个讨论非常清楚:

我不想使用子模块或将所有子目录中的 .git/ 重命名之类的替代方案。
我只是希望 Git 将我的 .git/ 子目录视为与任何其他名称相同的普通目录。

Brian m. Carlson (bk2204) 回答:

这是不可能的。
您无法将非裸库添加为父存储库的一部分,而不使用子模块。
Git 使用 .git 目录查找工作树,并出于安全原因不允许检入具有该名称的文件或目录。
允许用户检入 .git 目录将允许配置和挂钩作为存储库的一部分进行存储,如果有人克隆它然后进入子存储库,则可以执行任意代码。


你的1a和1b方法对我来说非常完美,谢谢。我知道这不是推荐的方法,但我真的需要这种灵活性。感谢你详细的回答! - stevo
5
没有选项使得 Git 将嵌套的 .git 目录视为普通目录吗? - Mr_and_Mrs_D
1
@Mr_and_Mrs_D 我不知道。 - VonC

8

这正是我在寻找的,但如果我尝试添加嵌套的 .git 本身,则会收到错误消息: error: Invalid path 'test/data/fixtures/clean/.git/COMMIT_EDITMSG' error: unable to add test/data/fixtures/clean/.git/COMMIT_EDITMSG to index fatal: adding files failed 不过,似乎实际文件可以工作,谢谢,这是一个开始。 - user1115652
1
我看到过人们将嵌套的.git文件夹重命名为.checkout_git,并根据需要重新命名回来。https://blog.gopheracademy.com/advent-2015/go-in-a-monorepo/ - Drew LeSueur
2
这似乎不再起作用了,git警告添加了一个嵌套的git存储库,并尝试像子模块一样为我添加它。 - saagarjha
这在我这里似乎仍然有效(2021年1月)。 - redfox05

2

1
糟糕 - 评论中的链接已损坏(您可能应该将其删除并添加到您的答案中) - Mr_and_Mrs_D

0

这不是最优雅的解决方案,但值得一提。

如果您将包含存储库的文件夹压缩成zip文件,您可以将其检入到外部存储库中。

这很有帮助,因为您将拥有完整的状态,包括git reflog


0

你可以做的最简单(也是最不干净的)方法之一就是重命名.git文件夹。

我的文件夹结构如下:

|- .git
|- folders
|- second-repo
     |- .git
     |- folders

我只是从根目录使用了这个 bash 命令:

mv /.git /.not_git

现在,您可以进入second-repo并使用其自己的git命令,这样您就可以来回使用两个git存储库。

PS:Git子模块是处理此问题的正确方法,但在我的情况下,我无法使用它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接