Не удается выполнить функциональное тестирование с адресом отправителя в службе или среде

Обновление: этот процесс настолько распространен, что команда git сделала это намного проще с помощью нового инструмента git subtree. См. Здесь: Подкаталог Detach (перемещение) в отдельный репозиторий Git


Вы хотите клонировать ваш репозиторий, а затем использовать git filter-branch для отметки всего, кроме подкаталога, который вы хотите

    1. Чтобы клонировать ваш локальный репозиторий:
      git clone /XYZ /ABC
      
      (Примечание: репозиторий будет клонирован с использованием жестких ссылок, но это не проблема, поскольку жесткий
    2. Теперь сохраним интересные ветви, которые мы также хотим переписать, а затем удалить начало координат, чтобы избежать нажатия туда и чтобы убедиться, что старые коммиты не будут ссылаться на источник:
      cd /ABC
      for i in branch1 br2 br3; do git branch -t $i origin/$i; done
      git remote rm origin
      
      или для всех удаленных ветвей:
      cd /ABC
      for i in $(git branch -r | sed "s/.*origin\///"); do git branch -t $i origin/$i; done
      git remote rm origin
      
    3. Теперь вы можете также удалить теги, которые не имеют никакого отношения к подпроекту; вы также можете это сделать позже, но вам может потребоваться сократить время репо. Я не сделал этого и получил WARNING: Ref 'refs/tags/v0.1' is unchanged для всех тегов (поскольку все они были не связаны с подпроектом); Кроме того, после удаления таких тегов больше места будет исправлено. По-видимому, git filter-branch должен иметь возможность переписывать другие теги, но я не мог проверить это. Если вы хотите удалить все теги, используйте git tag -l | xargs git tag -d.
    4. Затем используйте ветвь filter и reset, чтобы исключить другие файлы, чтобы их можно было обрезать. Давайте также добавим --tag-name-filter cat --prune-empty, чтобы удалить пустые коммиты и переписать теги (обратите внимание, что это должно будет удалить их подпись):
      git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC -- --all
      
      или, альтернативно, только переписать ветвь HEAD и игнорировать теги и другие ветви:
      git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC HEAD
      
    5. Затем удалите резервные блокировки, чтобы пространство было действительно исправлено (хотя теперь операция разрушительна)
      git reset --hard
      git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
      git reflog expire --expire=now --all
      git gc --aggressive --prune=now
      
      , и теперь у вас есть локальный репозиторий git подкаталога ABC со всей сохраненной историей.

    Примечание. Для большинства применений git filter-branch действительно должен иметь добавленный параметр -- --all. Да, это действительно - space - all. Это должны быть последние параметры для команды. Поскольку Мэтли обнаружил, это удерживает ветви проекта и теги, включенные в новое репо.

    Изменить: различные предложения из комментариев ниже были включены, чтобы убедиться, например, что хранилище фактически сокращено (что не было всегда раньше).

1
задан geoB 30 March 2019 в 21:47
поделиться