Мерзкий клон для конкретного тега
Я хочу клонировать репозиторий ядра 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
,