Прочтите полностью решение, но, к сожалению, 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 '