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
.