这是一个测试bash脚本来重建这个问题,git --version
说"git version1.9.1“。基本上,我有一个“源代码子模块”存储库/tmp/TestSubber
,我使用它作为“源超级项目”/tmp/TestMain
存储库中的子模块-我想要“本地”克隆的源代码作为/tmp/TestLocMain
,并在克隆中初始化子模块:
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
的最后一步将失败,并显示以下错误:
...
+ 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
行,那么最后一步会成功:
...
+ 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
中子模块的更新成功完成
发布于 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...
命令是否也会执行完整的签出(显然,它不会):
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
https://stackoverflow.com/questions/46507963
复制相似问题