Git мелкий клон для определенного тега

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

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

спасибо.

Ответ 1

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

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

Заметки:

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

Ответ 2

Прочитайте полностью для решения, но, к сожалению, клон git не работает так, как вы запрашиваете. Параметр --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
  • Определите sha 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"

  • В man-странице есть приятное предупреждение о переписывании истории 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

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

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

ОБНОВЛЕНИЕ

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

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

git filter-branch --commit-filter '
    if [ "$GIT_AUTHOR_EMAIL" = "" ];
    then
            GIT_AUTHOR_EMAIL="[email protected]";
            GIT_AUTHOR_NAME='tmp'
            GIT_COMMITTER_NAME='Me'
            GIT_COMMITTER_EMAIL='[email protected]'
            git commit-tree "[email protected]";
    else
            git commit-tree "[email protected]";
    fi '

Ответ 3

К сожалению, параметр --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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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