мерзкий клон для конкретного тега - PullRequest
30 голосов
/ 19 января 2012

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

git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git - глубина v3.0

спасибо.

Ответы [ 5 ]

52 голосов
/ 21 августа 2016

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

Примечания:

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

Прочтите полностью решение, но, к сожалению, git clone не работает так, как вы запрашиваете. Параметр --depth ограничивает число revisions, а не число commits. Нет параметра клонирования, который ограничивает количество коммитов. В вашей ситуации, даже если вы знали, что в файле, который больше всего изменился между версией 3.0 и новейшей HEAD в репо, использовалось не более 10 отличий ревизии, и вы использовали --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 '
2 голосов
/ 08 декабря 2017

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

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

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

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

2 голосов
/ 20 января 2012

К сожалению, параметр --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
0 голосов
/ 20 января 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...