Я пытаюсь настроить кеш на CircleCI для большого удаленного хранилища git.Проблема в том, что я хочу принудительно обновить содержимое репо после восстановления кэша.Для этого я использую команды , найденные в этом ответе SO , но git reset
на CircleCI работает намного медленнее, чем на моем компьютере.Если у меня есть репозиторий на локальном компьютере, и я выполняю git fetch && git reset --hard FETCH_HEAD
, а на локальном компьютере для нашего 30 ГБ репозитория требуется несколько секунд, но в CircleCI это занимает около 10 минут с большим выводом Checking out files
, что невидели локально.Есть ли способ оптимизировать это?Почему это происходит?Это связано с тем, что в CircleCI репозиторий git восстанавливается из кэша, поэтому метаданные некоторых файлов становятся грязными, поэтому git вынужден восстанавливать все файлы, в то время как локально он обнаруживает, что может что-то пропустить?В обоих случаях ничего действительно не меняется в хранилище.Поэтому я запускаю git reset
без каких-либо изменений.
Это соответствующая конфигурация CircleCI, которую я использую:
- run: git ls-remote --exit-code git@github.com:path/to/repo.git HEAD | cut -f 1 > /tmp/datasets-head
- restore_cache:
keys:
- v1-datasets-{{ checksum "/tmp/datasets-head" }}
- run:
command: |
if [ ! -d "/datasets/.git" ]; then
git clone git@github.github.com:path/to/repo.git /datasets
else
git -C /datasets fetch
git -C /datasets reset --hard FETCH_HEAD
git -C /datasets lfs fetch
git -C /datasets clean -d --force
fi
git -C /datasets rev-parse --verify HEAD > /tmp/datasets-head
- save_cache:
key: v1-d3m-datasets-{{ checksum "/tmp/datasets-head" }}
paths:
- /datasets
Так почему git reset --hard FETCH_HEAD
занимает много времени, даже если ничегоизменилось с тех пор, как был сделан кеш?Кроме того, почему, похоже, он воссоздает все файлы?