Повторяющиеся коммиты после ответвления фильтра перемещают корневой каталог - PullRequest
1 голос
/ 12 февраля 2012

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

Как сейчас:

wrongRootProjectDir/
|
+-.git
|
+-realProjectDir
   |
   +-<Project files>

Как это должно выглядеть:

realProjectDir
|
+-.git
|
+-<Project files>

Так что, в общем, я хотел бы перенести все на одну директорию вверх. wrongRootProjectDir также содержит только файл .git и каталог realProjectDir.

Я нашел несколько подсказок по SO Как мне переместить каталог в репозитории Git для всех коммитов? , что может быть способ. Я запускаю git clone oldrepo newrepo, чтобы получить резервную копию, и запускаю

git filter-branch --subdirectory-filter realProjectDir -- --all

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

(Commit A)
|
(Commit B)
|
(Commit C)
|
(Commit A')
|
(Commit B')
|
(Commit C')

Где A '- новые коммиты. Есть ли проблема с несколькими ветками и использованием filter-branches? Итак, сейчас у меня есть каждый коммит дважды , один раз с неправильным старым путем и один раз с новым.

Краткое описание

Есть ли способ переместить полное дерево каталогов на один уровень вверх и сохранить все ветви и слияния без генерации двойных коммитов?

Обновление Я все еще не могу сохранить свои коммиты слияния и правильное расположение веток. Все сплетено в цепочку коммитов.

Обновление

Добавлено дерево истории:

Commit history before filter-branch

и после запуска ответвления фильтра с помощью gitk:

Commit history after filter-branch

Рабочий каталог чист, когда я запускаю эту команду. Для проверки я скопировал все дерево каталогов с помощью простого cp -r в другой каталог и протестировал его там. Команда filter-branch работает в том смысле, что она перемещает подкаталог, но все равно выравнивает историю. Насколько я понимаю, я не сделал ничего слишком сложного, только обычное ветвление и слияние.

Update

Я показал неправильную картинку для состояния "до". Я пытался преобразовать не переписанный репозиторий.

Ответы [ 2 ]

1 голос
/ 12 февраля 2012

filter-branch с фильтром подкаталога является именно тем инструментом, который делает это. В этом вся его цель. Если у вас возникли проблемы, то, потому что вы делаете что-то неправильно, вы не сказали нам. filter-branch не выравнивает историю. Возможно, вы просматриваете gitk --all и видите как переписанную историю, так и старую историю (она будет отмечена original/refs/heads/...) - в этом случай, обратите внимание, что эти две истории не связаны. Также возможно, что вы сделали что-то, что испортило перед веткой фильтра. Когда вы пытаетесь снова, вы делаете это в новом клоне, начиная с той истории, которую вы хотите?

Вот самый простой пример, демонстрирующий, что это работает именно так, как должно:

git init
mkdir subdir
touch x subdir/a subdir/b subdir/c
git add subdir/a
git commit -m 'a'
git add subdir/b
git commit -m 'b'
git checkout -b foo HEAD^
git add subdir/c
git commit -m 'c'
git checkout master
git merge foo
git add x
git commit -m 'x'
git filter-branch --subdirectory-filter subdir -- --all
# now inspect e.g. with gitk --all

Оригинальные ссылки хранятся в refs / original / refs / ..., так что если вы облажались, вы можете вернуться к ним. Если вы проверите результаты и решите, что все хорошо, то вы можете удалить их. Метод, приведенный на странице руководства для этого:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

хотя на практике вы также можете просто сделать rm -rf .git/refs/original.

0 голосов
/ 12 февраля 2012

Это должно сделать это для вас (замените realProjectDir на имя этой папки):

git filter-branch --prune-empty --subdirectory-filter realProjectDir master

Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...