Как скопировать определенные файлы из одного git-репо в другой, сохранив историю - PullRequest
1 голос
/ 04 апреля 2019

У меня есть старое частное хранилище с файлами, которые я хотел бы поместить в GitHub, однако я хотел бы включить только определенные файлы или, возможно, только файлы с определенными расширениями файлов вместе с историей их фиксации.

Однако я не хочу включать какие-либо исключенные файлы в историю фиксации.

Я думаю, было бы идеально предоставить файл списка таких файлов, которые я хотел бы скопировать.

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Файлы не имеют истории коммитов. Коммиты являются историей, а коммиты имеют файлы.

Либо у вас есть эти коммиты (и, следовательно, эти файлы плюс все другие файлы), либо у вас нет этих коммитов (и, следовательно, у вас нет этих файлов).

Если вы хотите историю, в которой только эти файлы существуют, без каких-либо других файлов, которые являются частью коммитов, содержащих эти файлы, вы должны создать новую историю в котором существуют только эти файлы.

Как именно вы поступите так, зависит от вас. Вы можете сделать один коммит (без дополнительной истории - новая история - это всего лишь один коммит, с файлами как есть). Это более или менее то, что вы получите с ответом Майка Фабера . Или вы можете использовать git filter-branch или BFG для редактирования клона репозитория, создавая серию новых заменяющих коммитов, в которых есть файлы, которые вы хотите сохранить, но избегаете файлов, которые вы хотите удалить. Тогда у вас будет новая сфабрикованная история, в которой были зафиксированы только эти файлы.

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

(Часто достаточно только самой последней копии файлов, и в этом случае просто используйте метод, который делает хранилище с одним коммитом, хранящим последние версии файлов. Как правило, это проще, чем писать причудливый фильтр ветвления фильтра Я на самом деле не использовал BFG, возможно, это также облегчает эту работу.)

1 голос
/ 04 апреля 2019

Вот как вы можете подойти к этому.

  1. Создать новую папку для нового хранилища.
  2. Запустите git init в новой папке, чтобы инициализировать его как репозиторий git.
  3. Выполнить git clone -n [path to your old private git repo]. Это клонирует, но не проверяет какие-либо файлы. У вас останется только папка .git / старого частного репозитория.
  4. Запустите git checkout [file you want] для каждого файла, который вы хотите. Вероятно, вы можете использовать подстановочные знаки здесь (вы упомянули расширения файлов).
  5. Когда у вас есть все нужные файлы, удалите удаленный источник, который был добавлен командой clone, и добавьте удаленный источник с указанием пути к местоположению вашего нового хранилища.
  6. Нажмите
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...