Git将嵌套的git repos视为常规文件/文件夹

时间:2015-10-29 05:42:48

标签: git

我有一个像这样组织的顶级git repo:

  • 的.git /
  • repoA /
    • 的.git /
    • 文件
    • file2的
    • 文件夹/
    • ...
  • 文件
  • file2的
  • 文件夹/
  • ...

如何将git发送到addcommit repoA(以及repoA/.git),就像它们是常规文件/文件夹一样?

具体来说,我想绕过像子模块这样的文件夹的处理,但我想保留嵌套repo的分支/历史(因此需要.git文件夹)。

我不想改变嵌套仓库的状态(通过提交或合并历史记录),也不想将其推送到远程的单独仓库。

预期结果与我tar repoA以及之后的{ - 1}}相同。也就是说,所有文件都是完整的,没有任何修改或git的特殊处理。

2 个答案:

答案 0 :(得分:2)

您可以查看 git subtree

为此,如果您目前有子模块,可以点击“Convert a git repository from submodules to subtrees”:

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

(首先在你的回购的副本上测试)

答案 1 :(得分:1)

这不是直接可能的。 .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