Удалить Git LFS с веткой фильтра? (Невозможно повторно добавить неизмененный файл в индекс.)

Попытка перенести репозиторий (включая историю) ИЗ Git LFS.

Я запустил git lfs migrate export --include="*" --everything (упомянул здесь) в тестовом репозитории, но он не работал должным образом и оставил файлы указателей LFS вместо того, чтобы преобразовать их все в объекты.

Я попробовал альтернативные методы, следуя этому. К сожалению, он по-прежнему оставляет файлы указателей, поэтому я объединил его с этим.

В итоге я даже запустил все команды вместе:

git lfs uninstall
git filter-branch -f --prune-empty --tree-filter '
  git lfs fetch
  git lfs checkout
  git lfs ls-files | cut -d " " -f 3 | xargs touch
  git lfs ls-files | cut -d " " -f 3 | xargs git rm --cached
  git rm -f .gitattributes
  git lfs ls-files | cut -d " " -f 3 | xargs git add --force
  git add --renormalize .
' --tag-name-filter cat -- --all

Не работает. Дал мне следующую ошибку для нескольких файлов, и отфильтрованные коммиты имеют файлы указателей вместо объектов.

Errors logged to <PATH>
Use `git lfs logs last` to view the log.
Rewrite <COMMIT SHA ####> (2/9) (2 seconds passed, remaining 7 predicted)    
Checking out LFS objects:   0% (0/1), 0 B | 0 B/s           
Checking out LFS objects: 100% (2/2), 3.1 KB | 0 B/s, done
Error updating the git index:
error: picture.png: cannot add to the index - missing --add option?
fatal: Unable to process path picture.png

Я пробовал запускать те же команды только для подсказки, и похоже, что touch, rm --cached, add --renormalize ., add --force не показывают никаких изменений с git status. Поэтому я не могу повторно добавить очищенные/извлеченные объектные файлы в новую фиксацию.

Может в этом проблема? Итак, как принудительно повторно добавить неизмененный файл в индекс при использовании ветки фильтра?

(Используя Windows с git bash.)


person jndi75    schedule 01.01.2020    source источник
comment
Вы пробовали git lfs migrate export? См. stackoverflow.com/a/57681990/717372.   -  person Philippe    schedule 01.01.2020
comment
@Philippe Филипп Это было первое, что я попробовал. Как-то не сработало... оставил файлы указателей в моей истории, а также стер папку объектов LFS :(   -  person jndi75    schedule 02.01.2020
comment
@Philippe Филипп Я перечитал пост и заметил, что я по-другому установил параметр --include. После точного выполнения шагов файлы содержимого успешно заменили указатели. Но это дает мне новую проблему! Проверка любого коммита показывает ошибки Обнаруженные # файлы, которые должны были быть указателями, но не были, и файлы отображаются как измененные, поэтому git заставляет меня добавить их в новый коммит.   -  person jndi75    schedule 02.01.2020
comment
Я предполагаю, что вы получили это сообщение, потому что у вас все еще установлен lfs (вы должны удалить фильтры в файле .gitattributes)   -  person Philippe    schedule 02.01.2020
comment
@ Филипп Ты прав. После этого я сделал фиктивную фиксацию, за которой последовал древовидный фильтр с git rm -f .gitattributes. Хорошо получилось. (Меня это удивляет, потому что git lfs migrate export уже добавил строку в .gitattributes для отмены фильтров lfs, но, возможно, я неправильно указал файлы.) Спасибо! Если вы хотите добавить свой ответ, я приму его (или могу добавить). :)   -  person jndi75    schedule 03.01.2020
comment
Я написал немного лучший ответ;)   -  person Philippe    schedule 03.01.2020


Ответы (1)


  1. Сделайте git lfs migrate export --everything --include ., чтобы заменить все указатели LFS реальными файлами в истории git. Дополнительные сведения см. на странице http://stackoverflow.com/a/57681990/717372.

  2. Запустите git lfs uninstall, чтобы удалить перехватчики lfs.

  3. И убедитесь, что у .gitattributes удалены фильтры lfs.

    Если фильтры lfs не были удалены, и если .gitattributes был нужен только для LFS, удалите файл во всей истории с помощью:

    git filter-branch -f --prune-empty --tree-filter '
      git rm -f .gitattributes --ignore-unmatch
    ' --tag-name-filter cat -- --all
    

    В противном случае, если .gitattributes содержит строки, отличные от LFS, удалите только фильтры LFS, заменив указанную выше команду tree-filter на git lfs untrack (ссылка здесь и здесь).

person Philippe    schedule 03.01.2020