在父存储库中包含的git存储库,除非设置为子模块,否则不会包含在父级提交中。是否可以覆盖此行为并将嵌套的git存储库视为任何其他目录?我不想通过子模块依赖外部依赖项,但想要使用git来管理项目内的这些依赖关系。
(Note: "git" and "submodule" are technical terms and should not be translated into Chinese)在父存储库中包含的git存储库,除非设置为子模块,否则不会包含在父级提交中。是否可以覆盖此行为并将嵌套的git存储库视为任何其他目录?我不想通过子模块依赖外部依赖项,但想要使用git来管理项目内的这些依赖关系。
(Note: "git" and "submodule" are technical terms and should not be translated into Chinese)1/ 您可以通过以下方式覆盖它:
$GIT_DIR
.git
目录定义为外部.git
目录(外部于嵌套仓库和主仓库)。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
目录将允许配置和挂钩作为存储库的一部分进行存储,如果有人克隆它然后进入子存储库,则可以执行任意代码。
我发现另一种方法似乎适合我
如果你执行git add somefolder/
<-- 确保末尾有 /
,那么它将添加所有文件而不是像子模块一样处理。
更多信息请参见:http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb
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.git
文件夹重命名为.checkout_git
,并根据需要重新命名回来。https://blog.gopheracademy.com/advent-2015/go-in-a-monorepo/ - Drew LeSueur这不是最优雅的解决方案,但值得一提。
如果您将包含存储库的文件夹压缩成zip文件,您可以将其检入到外部存储库中。
这很有帮助,因为您将拥有完整的状态,包括git reflog
。
你可以做的最简单(也是最不干净的)方法之一就是重命名.git
文件夹。
我的文件夹结构如下:
|- .git
|- folders
|- second-repo
|- .git
|- folders
我只是从根目录使用了这个 bash 命令:
mv /.git /.not_git
second-repo
并使用其自己的git命令,这样您就可以来回使用两个git存储库。
PS:Git子模块是处理此问题的正确方法,但在我的情况下,我无法使用它们。