Как перенести файл из одного хранилища git в другой, сохраняя историю
Я пытаюсь переместить один файл (назовем его foo.txt) из одного репозитория в другой (несвязанный) репозиторий, сохраняя его историю. вопрос ebneter показывает, как это сделать для подкаталога. taw question содержит некоторые подсказки и предложения, но не пошаговую процедуру для подражания. jkeating question выглядел многообещающим, но не работал у меня. Поисковые запросы Google оказались пустыми для данного конкретного случая использования. Я ищу для этого четкую последовательность команд.
Последовательность команд, которые я начал выполнять, была следующей:
$ git clone source-repo/ source-repo-copy
$ cd source-repo-copy
$ git filter-branch --tree-filter 'test ! "[email protected]" = "foo.txt" && \
git rm --cached --ignore-unmatch [email protected] || true' --prune-empty
Логика моей команды filter заключается в git rm
всех файлах, которые не являются foo.txt. Я добавил команду || true
в команду, чтобы заставить ее иметь нулевое возвращаемое значение для соответствия ветки фильтра.
Мое намерение состояло в том, чтобы установить source-repo-copy как удаленный для моего целевого репозитория (target-repo), и предположив, что git filter-branch
отфильтровывает все, кроме foo.txt, извлекает и объединяет исходный-репо-копировать в target- Сделки рЕПО. К сожалению, команда git filter-branch
, казалось, не имела никакого эффекта. Он работал без ошибок и, казалось, измельчался через 600+ коммиттов в source-repo, но когда он закончил, git log
и файлы в исходной-репо-копии выглядели одинаково. Должны ли отсутствовать все файлы, кроме foo.txt, и все фиксации, которые не касались его, исчезли из журнала?
В этот момент я не знаю, как действовать. Любые предложения?
Ответы
Ответ 1
Это сработало для меня, но с целым каталогом.
Как показано здесь
~$ cd neu
~/neu$ git filter-branch --subdirectory-filter FooBar HEAD
~/neu$ git reset --hard
~/neu$ git remote rm origin
~/neu$ rm -r .git/refs/original/
~/neu$ git reflog expire --expire=now --all
~/neu$ git gc --aggressive
~/neu$ git prune
~/neu$ git remote add origin git://github.com/FooBar/neu.git
EDIT: для одного файла:
Сначала отфильтруйте каталог:
git filter-branch --prune-empty --subdirectory-filter myDirectory -- --all
Отфильтровать один файл:
git filter-branch -f --prune-empty --index-filter "git rm --cached --ignore-unmatch $(git ls-files | grep -v 'keepthisfile.txt')"
Сделайте некоторую очистку:
git reset --hard
git gc --aggressive
git prune
Это должно сделать это.
Ответ 2
См. мой ответ на аналогичный вопрос о перемещении папок, где я также отвечу, как переместить один файл. fooobar.com/info/5861/...
Я попытался скопировать его здесь, но кажется, что он не разрешен, поскольку он был удален.