Удаление зафиксированного и отправленного большого файла из ранней истории git - PullRequest
0 голосов
/ 23 марта 2020

Я действительно новичок в использовании git и сделал ошибку, чтобы также поместить sh мой (большой) файл данных (в большом файле .RData) в мой онлайн-репозиторий на gitlab. Теперь мой максимальный размер достигнут, и я больше не могу толкать. Поэтому я хотел бы удалить файл данных. Я нашел команду git filter-branch. Однако проблема заключается в том, что при самых ранних фиксациях файл назывался datafile_early.RData, затем после нескольких коммитов этот файл был удален и заменен на datafile_later.RData (я также работаю с другими в этом хранилище).

Итак, как мне очистить datafile_early.RData от истории? Я попытался: git filter-branch -f --tree-filter 'rm datafile_early.RData', он начал удалять его из первых коммитов, но не смог, так как из-за более поздних коммитов он больше не мог найти файл.

Rewrite a9c05c45dd0c2dacb7ba79cf829fb76a3fb70da3 (4/22) (22 seconds passed, remaining 99 predicted)  rm: datafile_early.RData: No such file or directory
tree filter failed: rm datafile_early.RData

Какие еще варианты у меня есть?

1 Ответ

1 голос
/ 23 марта 2020

При использовании git filter-branch:

  • --tree-filter является очень медленным; используйте --index-filter, если это вообще возможно.
  • Настройте каждый фильтр так, чтобы он не сообщал о состоянии отказа.

Вторая точка - это Lasse V. Карлсен упомянул в комментарии : вы, вероятно, захотите, чтобы ваша команда фильтра дерева прочитала rm -f datafile_early.RData datafile_later.RData, чтобы удалить любой из этих файлов, и затем преуспела бы, даже если ничего не удалила.

Чтобы обратиться к первому Обратите внимание, что древовидный фильтр, состоящий из rm команд, может быть заменен индексным фильтром, состоящим из git rm --cached команд. В этом случае подходящей командой сопоставления будет:

git rm --cached --ignore-unmatch datafile_early.RData datafile_later.RData

Поэтому вся команда git filter-branch будет , вероятно:

git filter-branch \
  --index-filter \
  'git rm --cached --ignore-unmatch datafile_early.RData datafile_later.RData' \
  --tag-name-filter cat -- --all

(необязательно, удалите обратную косую черту sh -настрочные последовательности, чтобы все это было одной строкой), которые должны выполняться значительно меньше времени, чем --tree-filter вариант.

...