Неглубокий клон с подмодулями в git, как использовать целые коммиты, а не последние?

Я знаю, что возможно иметь мелкие подмодули, используя опцию --depth с git submodule update.

Однако, если я запустил

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

в моем проекте с несколькими подмодулями, я получаю a fatal: reference is not a tree. Поэтому я снова попробовал

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

который работал правильно, однако я хотел бы сохранить глубину в 1.

Мне кажется, что --depth 1 вытаскивает последнюю комманду в подмодуле, а не фиксацию, указанную основным репозиторием, и почему ее установка 100 решила проблему, поскольку она вытащила более длинный список коммитов, включая.

К сожалению, если в этом случае я не могу вообще быть уверен, что последние 100 коммитов включают тот, который мне нужен.

Как сообщить git использовать отмеченные коммиты, а не последние в мелком клоне с подмодулями?

Я использую git 1.9.4 для Windows.

Ответ 1

К сожалению, не существует способа сделать git fetch только с определенным кодом фиксации. Если есть, я действительно хотел бы знать. Однако я рассмотрел вашу проблему двумя разными способами: один, если это возможно, создать тег или ветку в удаленном репозитории, который указывает на коммит, который я хочу, скажем, мы называем его "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

Вы можете увеличивать с помощью более чем одной фиксации за раз, чтобы сделать ее быстрее, но вы можете столкнуться с некоторыми более ранними фиксациями, чем тот, который вы хотите.