使用git子模块时遇到问题。
每当我从上游存储库收到一个新的子模块引用时,执行git submodule update
会得到以下结果:
fatal: reference is not a tree: dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
Unable to checkout 'dd208d46ecdd1ac0d2b2594a610fe4c9150fece1' in submodule path 'submodule/path'
重要的是要注意子模块有几个遥控器,其中上游遥控器应该用于更新子模块参考树。我猜我的问题在那里,但我不确定。
我的设置如下:
Git项目
遥控器:
origin
(我的git fork)upstream
(项目回购)子模块“模块”,有遥控器:
origin
(我的git fork)upstream
(项目回购)有谁知道是什么原因引起了我的问题?
答案 0 :(得分:36)
执行git submodule update
时,git会尝试签出保存在超级项目中的提交/树(在您的示例中,提交标识为dd208d4...
的
我认为你得到了错误,因为在子模块中没有这样的对象存在。你必须确保它在那里。通常这意味着您必须首先从远程获取/拉取它。
可能你必须
git submodule foreach git fetch
git submodule update
或者
git fetch --recurse-submodules
假设已配置子模块,以便它可以从远程origin
获取丢失的提交。最后,你必须知道,从哪里可以获取丢失的提交,你必须得到它。
您可以通过执行以下操作来检查您是否dd208d4...
:
cd ./module
git log dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
git cat-file -p dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
git ls-tree dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
出现这种问题的一个可能原因是,从超级模块发布新提交的人没有从子模块发布必要的提交。他必须首先从子模块中发布提交。
答案 1 :(得分:7)
确保已推送子模块
cd submodule-dir
git push
在我的情况下,我有:
所以难怪它无法找到。
然后,如果您使用的是GitHub等Web界面,您还可以转到子模块存储库网页,并仔细检查您需要的提交是否显示在那里。
<强> push.recurseSubmodules on-demand
强>
可以通过以下方式进一步自动推送:
git push --recurse-submodules=on-demand
也会根据需要推送子模块,或者从2.7开始:
git config push.recurseSubmodules on-demand
git push
答案 2 :(得分:1)
我遇到了同样的问题,我解决了为父项目添加新提交并推送所有
答案 3 :(得分:1)
当我忘记推送其中一个子模块
时,只看到了这个问题确保推送更改
答案 4 :(得分:0)
我的问题是,在cat .gitmodules
我的回购中,我指着子模块的回购错误的遥控器(我最初用原始遥控器克隆它,但后来换成了它的叉子; gitmodules
文件从未更新以反映更改。
答案 5 :(得分:0)
我的问题是我在build.gradle文件中的子模块中有未提交的更改(我认为这些文件已自动更改)。他们出现在git diff
。我刚刚git checkout .
重置了子模块repos,没有任何更改,然后git submodule update
工作。
答案 6 :(得分:0)
另一种方法可能是,没有命令行git选项,而是手动执行此操作。 当子模块路径已被移动/替换(但不正确)时,这种情况大多发生,从而仍然指向本地结帐存储库中的旧引用。
1)找到存储库和子模块
ls -la .git/modules
rm -f .git/modules/<module-with-issue>
2)删除旧的本地子模块配置
gedit .git/config
(在此处删除子模块的网址条目)
看起来像这样;
*[submodule "module-with-issue"]
url = ...*
3)现在,重新获取并更新子模块 git获取 git子模块更新--recursive --init
注意: 在尝试子模块更新之前,可能还需要删除存储库中本地已签出的子模块文件夹。
答案 7 :(得分:0)
添加git rm --cached <submodule-directory>
可以帮助我使用gitlab:
.prepare_deploy: &prepare_deploy
before_script:
- bundle install -j $(nproc) --path vendor
- which ssh-agent || (apt-get update -y && apt-get install openssh-client -y)
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- eval $(ssh-agent -s)
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
- (echo "$SSH_PRIVATE_KEY" | base64 --decode) > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- git rm --cached <submodule-directory>
- git submodule sync --recursive
- git submodule update --init --recursive