12

我知道使用--depth带有git submodule update.

但是,如果我跑

git submodule update --init --recursive --depth 1

在我有几个子模块的项目中,我得到了一个fatal: reference is not a tree. 所以我再次尝试了

git submodule update --init --recursive --depth 100

它工作正常,但是我想将深度保持在 1。

在我看来,--depth 1拉取子模块中的最新提交,而不是主存储库指向的提交,这就是为什么将其设置为 100 解决了问题,因为它拉取了更长的提交列表,包括指向的提交。

不幸的是,如果是这种情况,那么我通常不能确定最近的 100 次提交包括我需要的那一次。

我如何告诉 git 使用指向的提交而不是带有子模块的浅克隆中的最新提交?

我在 Windows 上使用 git 1.9.4。

4

1 回答 1

7

不幸的是,似乎没有办法git fetch只使用特定的提交 ID。如果有我真的很想知道。但是,我以两种不同的方式处理了您的问题:一种是在可能的情况下在远程存储库上创建一个标签或分支,该标签或分支指向我想要的提交,例如我们称之为“ref”。这样我就可以获取远程引用并将其--depth应用于它,而不是最新的提示。而不是git submodule update --init我这样做:

git submodule init
git clone --depth 1 -b ref --separate-git-dir .git/modules/sub/ repository sub

其中“sub”是子模块的名称和路径(为简单起见,假设它们是相同的)

另一种方式,如果您无法在远程存储库中创建标签或分支,则在循环中搜索您想要的提交:

git submodule init
id=$(git submodule status|sed -ne 's/.\([a-z0-9]*\) sub.*/\1/p'
git clone --depth 1 --separate-git-dir -n .git/modules/sub/ repository sub    
cd sub
while ! git rev-list $id ; do
    git fetch --depth $((i+=1))
done
git checkout $id

您可以一次增加多个提交以使其运行得更快,但您最终可能会得到一些比您想要的更早的提交。

于 2014-12-12T13:48:44.923 回答