Подтвердить что ты не робот

Как перенести файл из одного хранилища 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, и все фиксации, которые не касались его, исчезли из журнала?

В этот момент я не знаю, как действовать. Любые предложения?

4b9b3361

Ответ 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/...

Я попытался скопировать его здесь, но кажется, что он не разрешен, поскольку он был удален.