Git将嵌套的git仓库视为普通文件/文件夹

10
我有一个顶级 git 仓库,组织结构如下:
  • .git/
  • repoA/
    • .git/
    • file
    • file2
    • folder/
    • ...
  • file
  • file2
  • folder/
  • ...
我该如何让 git 添加并提交 repoA(以及repoA/.git)文件夹,就像它们是常规文件/文件夹一样?
具体来说,我想要绕过将此类文件夹视为子模块的处理,但我希望保留嵌套版本库的分支/历史记录(因此需要 .git 文件夹)。
我不想改变嵌套版本库的状态(通过提交或合并历史记录),也不想将其推送到远程的单独版本库。
预期结果与 tar repoA 和稍后解压缩它相同。也就是说,所有的文件都完整无缺,没有被 Git 修改或特殊处理。

相关链接:https://webmasters.stackexchange.com/questions/84378/how-can-i-create-a-git-repo-that-contains-several-other-git-repos 和 https://dev59.com/WVYN5IYBdhLWcg3wuaJx 以及 https://stackoverflow.com/questions/9674576/how-can-i-get-git-to-add-files-already-tracked-under-another-git-repository - Gabriel Staples
相关链接:https://dev59.com/-53ha4cB1Zd3GeqPNgG7#40922436 - jthill
2个回答

5
这是不可能直接实现的。对于git来说,.git目录具有特殊意义。当你在git工作树中运行git操作(不一定是在顶层),没有明确指定存储库路径(通过--git-dir选项或GIT_DIR环境变量)时,后者会自动查找包含.git子目录的第一个祖先目录。一个旨在被视为常规内容的.git目录会干扰该过程。
但是,我可以建议以下解决方法:
  1. 在您的子存储库中,将.git目录重命名为其他名称(例如.git.subrepo.pseudogit等):
mv repoA/.git repoA/.pseudogit
  1. 添加并提交子仓库目录:
git add repoA
git commit -m "Added repoA as regular sub-directory"

在此之后,从子仓库树内部进行的git操作将默认使用主仓库。当您需要研究子仓库的历史记录时,您需要使用--git-dir选项:

cd repoA
git --git-dir .pseudogit log

4

你可以了解一下 git subtree

如果你目前有子模块,可以按照 "将git仓库从子模块转换为子树" 进行操作:

cat .gitmodules |while read i
do
  if [[ $i == \[submodule* ]]; then
    mpath=$(echo $i | cut -d\" -f2)
    read i; read i;
    murl=$(echo $i|cut -d\  -f3)
    mcommit=`eval "git submodule status ${mpath} |cut -d\  -f2"`
    mname=$(basename $mpath)
    echo -e "$name\t$mpath\t$murl\t$mcommit"
    git submodule deinit $mpath
    git rm -r --cached $mpath
    rm -rf $mpath
    git remote add $mname $murl
    git fetch $mname
    git branch _$mname $mcommit
    git read-tree --prefix=$mpath/ -u _$mname
fi
done
git rm .gitmodules

(先在您的存储库副本上进行测试)

还可以参考"何时使用git子树?",它与ingydotnet/git-subrepo不同。


你的第一个链接现在是这个:https://www.atlassian.com/git/tutorials/git-subtree。它会自动转发,所以没什么大不了的。看起来是一篇相当不错的文章。我正在阅读它。 - Gabriel Staples
相关:https://dev59.com/4VwY5IYBdhLWcg3wno4r - Gabriel Staples
还有另一种选择:https://github.com/ingydotnet/git-subrepo - Gabriel Staples
@GabrielStaples 谢谢。我已经相应地更新了答案。 - VonC
1
很高兴能帮忙。上周末我刚写了一个 git disable-repos 工具,用于归档一堆需要修复和恢复的旧项目(放入单个父存储库中):https://dev59.com/WVYN5IYBdhLWcg3wuaJx#62368415。也许你或其他人也会发现它有用。 - Gabriel Staples

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