Мерзкий клон для конкретного тега

Я хочу клонировать репозиторий ядра Linux, но только начиная с версии 3.0, поскольку репо ядра настолько велико, что мои инструменты управления версиями работают быстрее, если я могу сделать мелкое клонирование. Суть моего вопроса такова: как я могу сказать git, какое значение "n" для параметра --depth? Я надеялся, что это сработает:

git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth v3.0

Благодарю.

6 ответов

Как насчет клонирования тега на глубину 1?

  • git clone --branch mytag0.1 --depth 1 https://example.com/my/repo.git

Заметки:

  • --depth 1 подразумевает --single-branchпоэтому информация из других веток не доставляется в клонированный репозиторий
  • если вы хотите клонировать локальный репозиторий, используйте file:// вместо только пути к хранилищу

Прочитайте полностью для решения, но, к сожалению, git clone не работает так, как вы запрашиваете. --depth параметр ограничивает количество revisions не количество commits, Нет параметра клона, который ограничивает количество коммитов. В вашей ситуации, даже если вы знали, что было не более 10 отличий ревизии от файла, который больше всего изменился между v3.0 и новейшей HEAD в репо и использовал --depth 10 Вы все еще можете получить большую часть или всю историю репо. Потому что некоторые объекты могут иметь не более 10 ревизий, и вы получите их историю вплоть до начала их первого появления в репо.

Теперь вот как вы можете делать то, что вам нравится: ключ к вашей проблеме в том, что вам нужны коммиты между v3.0 и последними самыми нужными ссылками. Вот шаги, которые я сделал, чтобы сделать это:

  • git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth 10075 smaller_kernel_repo
  • cd smaller_kerenel_repo
  • Определите ша v3.0 git log --oneline v3.0^..v3.0
  • Создайте точку пересадки, начиная с этого ша (это 02f8c6aee8df3cdc935e9bdd4f2d020306035dbe)
  • echo "02f8c6aee8df3cdc935e9bdd4f2d020306035dbe" > .git/info/grafts
  • Чтобы обойти некоторые проблемы с некоторыми записями журнала ядра, сделайте: export GIT_AUTHOR_NAME="tmp" а также export GIT_COMMITTER_NAME="tmp"

  • На странице руководства есть хорошее предупреждение о git filter-branch переписывая историю, следуя очкам взяточничества git filter-branch и сидеть сложа руки и ждать... (и ждать и ждать)

Теперь нужно все почистить

git reflog expire --expire=now --all
git repack -ad  # Remove dangling objects from packfiles
git prune       # Remove dangling loose objects

Этот процесс занимает много времени, но не очень сложный. Надеюсь, это сэкономит вам все время, на которое вы надеялись в долгосрочной перспективе. На данный момент у вас будет репо с исправленной историей, начиная с версии 3.0 и выше, начиная с репозитория linux-stable.git. Так же, как если бы использовали --depth на клоне у вас есть те же ограничения на репо, и вы сможете изменять и отправлять патчи только из той истории, что у вас уже есть. Есть способы обойти это.. но это заслуживает своего собственного Q&A.

Я сам проверяю последние несколько шагов, но git filter-branch операция еще продолжается. Я буду обновлять этот пост с любыми проблемами, но я опубликую его, чтобы вы могли начать этот процесс, если сочтете его приемлемым.

ОБНОВИТЬ

Обход проблемы (фатально: пустой идентификатор <> не разрешен). Эта проблема связана с проблемой в истории коммита репозитория linux.

Изменить git filter-branch команда для:

git filter-branch --commit-filter '
    if [ "$GIT_AUTHOR_EMAIL" = "" ];
    then
            GIT_AUTHOR_EMAIL="tmp@tmp";
            GIT_AUTHOR_NAME='tmp'
            GIT_COMMITTER_NAME='Me'
            GIT_COMMITTER_EMAIL='me@me.com'
            git commit-tree "$@";
    else
            git commit-tree "$@";
    fi '

Для тех, у кого уже есть клон, эта команда получит количество коммитов между кончиком текущей ветви и тегом. 5.6:

$ git rev-list HEAD ^5.6 --count
407

Я обнаружил, что этот проект реализует список версий с помощью API GitHub: https://github.com/cjlarose/github-rev-list

Очень длинная справочная страница в rev-list указывает на то, что за кулисами происходит много всего. Есть много разных путей для подсчета коммитов с приходом и уходом веток и слияний. Для этого варианта использования, хотя это может быть проигнорировано (?)

К сожалению --depth параметр git clone принимает только число, количество ревизий, до которых должен быть усечен клонирующий репозиторий.

Возможное решение - клонировать весь репозиторий, а затем обрезать его историю, чтобы сохранить только коммиты после v3.0. Вот хорошее практическое руководство: http://bogdan.org.ua/2011/03/28/how-to-truncate-git-history-sample-script-included.html

git checkout --orphan temp v3.0
git commit -m "Truncated history"
git rebase --onto temp v3.0 master
git branch -D temp
git gc

Для этого я опубликовал действие Github.

https://github.com/AlexAtkinson/github-action-checkout-from-tag

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

--depth Параметр представляется только числом ("указанное количество ревизий"), а не тегом.

Возможная идея (подлежит проверке):

Вы могли бы использовать git describe хотя для того, чтобы получить самый последний тег от вашего текущего заголовка, а также количество коммитов между упомянутым тегом и HEAD,
Если этот "последний тег" не является вашим тегом, просто повторите процесс, начиная с коммита, на который ссылается этот последний тег, до тех пор, пока вы не найдете свой тег (v3.0 в вашем случае например).

Сумма всех этих номеров коммитов даст вам глубину, чтобы дать git clone команда, если ваш тег доступен из вашего текущего HEAD,

Другие вопросы по тегам