我有一个像这样组织的顶级git repo:
如何将git发送到add
和commit
repoA
(以及repoA/.git
),就像它们是常规文件/文件夹一样?
具体来说,我想绕过像子模块这样的文件夹的处理,但我想保留嵌套repo的分支/历史(因此需要.git
文件夹)。
我不想改变嵌套仓库的状态(通过提交或合并历史记录),也不想将其推送到远程的单独仓库。
预期结果与我tar
repoA
以及之后的{ - 1}}相同。也就是说,所有文件都是完整的,没有任何修改或git的特殊处理。
答案 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
目录会干扰该过程。
但是,我可以建议以下解决方法:
.git
目录重命名为其他名称(例如 .git.subrepo
、.pseudogit
等):mv repoA/.git repoA/.pseudogit
git add repoA
git commit -m "Added repoA as regular sub-directory"
在此之后,子存储库树内部的 git 操作将默认使用主存储库。当您需要研究子存储库的历史时,您将不得不使用 --git-dir
选项:
cd repoA
git --git-dir .pseudogit log