首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >git分离源文件中的头导致“git子模块更新”失败,并显示“fatal: Needed a single revision”

git分离源文件中的头导致“git子模块更新”失败,并显示“fatal: Needed a single revision”
EN

Stack Overflow用户
提问于 2017-10-01 07:34:09
回答 1查看 177关注 0票数 0

这是一个测试bash脚本来重建这个问题,git --version说"git version1.9.1“。基本上,我有一个“源代码子模块”存储库/tmp/TestSubber,我使用它作为“源超级项目”/tmp/TestMain存储库中的子模块-我想要“本地”克隆的源代码作为/tmp/TestLocMain,并在克隆中初始化子模块:

代码语言:javascript
运行
复制
set -x

rm -rfv /tmp/TestSubber /tmp/TestMain /tmp/TestLocMain
mkdir /tmp/TestSubber /tmp/TestMain
cd /tmp/TestSubber; git init;
git config user.name me; git config user.name me@example.com;
echo "aaaa" >> a.txt ; git add a.txt; git commit -m 'commit 01'
echo "aaaa" >> a.txt ; git add a.txt; git commit -m 'commit 02'
echo "aaaa" >> a.txt ; git add a.txt; git commit -m 'commit 03'
echo "aaaa" >> a.txt ; git add a.txt; git commit -m 'commit 04'
git checkout HEAD~2
git status # HEAD detached at f221985

cd /tmp/TestMain; git init;
git config user.name me; git config user.name me@example.com;
echo "bbbb" >> b.txt ; git add b.txt; git commit -m 'commit 01'
git submodule add -b master --depth 1 -- https://github.com/rtyley/small-test-repo TestSubber
git add -u; git commit -m 'added submodule'

cd /tmp
git clone file:///tmp/TestMain /tmp/TestLocMain
cd TestLocMain
sed -i"" 's!https://github.com/rtyley/small-test-repo!file:///tmp/TestSubber!g' .gitmodules
git submodule sync
git submodule update --init --remote --depth 1 --merge -- TestSubber

运行此脚本时,使用git submodule update的最后一步将失败,并显示以下错误:

代码语言:javascript
运行
复制
...
+ git submodule update --init --remote --depth 1 --merge -- TestSubber
Submodule 'TestSubber' (file:///tmp/TestSubber) registered for path 'TestSubber'
Cloning into 'TestSubber'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
Checking connectivity... done.
From file:///tmp/TestSubber
 * branch            HEAD       -> FETCH_HEAD
fatal: Needed a single revision
Unable to find current origin/master revision in submodule path 'TestSubber'

看起来问题出在源代码子模块repo /tmp/TestSubber中的git checkout HEAD~2,它强制该repo处于分离的头部状态;如果您注释git checkout HEAD~2行,那么最后一步会成功:

代码语言:javascript
运行
复制
...
+ git submodule update --init --remote --depth 1 --merge -- TestSubber
Submodule 'TestSubber' (file:///tmp/TestSubber) registered for path 'TestSubber'
Cloning into 'TestSubber'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
Checking connectivity... done.
Submodule path 'TestSubber': checked out 'ad110f4932339fe5efb940608139b08a28b8c518'

现在,我的实际用例是,与TestSubber对应的内容非常庞大,需要暂时保持分离的头部状态。是否可以在不更改TestSubber的状态的情况下,强制TestLocMain中子模块的更新成功完成

EN

回答 1

Stack Overflow用户

发布于 2017-10-01 07:59:09

好了,看起来我明白了--基本上,我们需要将/tmp/TestLocMain/.git/modules/TestSubber重新构建为一个简单的存储库,然后以GIT_DIR作为git pull,以GIT_WORK_TREE作为/tmp/TestLocMain/TestSubber,最后发出git submodule update...命令(它现在不需要--merge或其他任何东西)。注意,我添加了一个100MB文件的生成和添加,以测试git submodule update...命令是否也会执行完整的签出(显然,它不会):

代码语言:javascript
运行
复制
set -x

rm -rfv /tmp/TestSubber /tmp/TestMain /tmp/TestLocMain
mkdir /tmp/TestSubber /tmp/TestMain
cd /tmp/TestSubber; git init;
git config user.name me; git config user.name me@example.com;
echo "aaaa" >> a.txt ; git add a.txt; git commit -m 'commit 01'
echo "aaaa" >> a.txt ; git add a.txt; git commit -m 'commit 02'
echo "aaaa" >> a.txt ; git add a.txt; git commit -m 'commit 03'
echo "aaaa" >> a.txt ; git add a.txt; git commit -m 'commit 04'
dd if=/dev/urandom of=big.file bs=1M count=100
git add big.file; git commit -m 'commit 05 big.file'
git checkout HEAD~2
git status # HEAD detached at f221985

cd /tmp/TestMain; git init;
git config user.name me; git config user.name me@example.com;
echo "bbbb" >> b.txt ; git add b.txt; git commit -m 'commit 01'
git submodule add -b master --depth 1 -- https://github.com/rtyley/small-test-repo TestSubber
git add -u; git commit -m 'added submodule'

cd /tmp
git clone file:///tmp/TestMain /tmp/TestLocMain
cd TestLocMain
sed -i"" 's!https://github.com/rtyley/small-test-repo!file:///tmp/TestSubber!g' .gitmodules
git submodule sync
mkdir -p .git/modules/TestSubber
MODDIR="`cd .git/modules/TestSubber && pwd`"
GIT_DIR="$MODDIR" git init --bare
GIT_DIR="$MODDIR" git config core.bare false
GIT_DIR="$MODDIR" git remote add origin file:///tmp/TestSubber
cd /tmp/TestLocMain
echo 'gitdir: ../.git/modules/TestSubber' > TestSubber/.git
GIT_DIR="$MODDIR" GIT_WORK_TREE="/tmp/TestLocMain/TestSubber" git pull --depth=1 origin master

git submodule update --init --remote --depth 1 -- TestSubber
git submodule status
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46507963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档