Как мне расширить репозиторий git? - PullRequest
5 голосов
/ 04 января 2012

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

То же самое со следующим деревом:

a/b/c

c в настоящее время содержит хранилище, но я хотел бы иметь хранилище в a и включить всю историю в c.

Я уверен, что есть способ обойти это, возможно, с некоторыми git filter-branch?Я не хочу использовать подмодули, в конце я хотел бы иметь один репозиторий.

Ответы [ 3 ]

3 голосов
/ 04 января 2012

Вам нужно создать новый внешний репозиторий и объединить внутренний, используя слияние поддеревьев. В нижней части этой страницы есть краткое HOWTO. . Вам следует временно переместить c за пределы a / b, эти инструкции предполагают, что дерево c еще не существует в своем окончательном месте.


Если вы хотите, чтобы c казался вложенным в его прошлую историю (и все в порядке с измененными sha1s), используйте вместо этого фильтр-ветвь ( credit ):

git filter-branch --index-filter \
    'git ls-files -s | sed "s#\t#&a/b/c/#" |
            GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
                    git update-index --index-info &&
     mv -T "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' -- --all
2 голосов
/ 04 января 2012

У вас есть выбор:

Вы можете просто переместить текущую структуру в то, что будет новой структурой.Затем переместите весь репо на уровень выше.git add -A добавит все изменения, которые представляют собой кучу удалений и добавит новый файл.git status покажет их как перемещенные.Каждый объект сохраняется один раз, независимо от того, по какому пути он находится, поэтому это не будет дорогой операцией.Это был бы самый простой вариант.В это время вы также можете поместить другие каталоги высокого уровня.

в то время как в c:

mkdir b
cd b
mkdir c
mv <all other objects from top level> c
git add -A
git commit -m "moved everything"
mv c a
# clean up

git определит тот факт, что файл был перемещен, если вы выполняете слияния и помощьВы.

Или, вы можете использовать ветку фильтра, чтобы изменить историю, если хотите, но все ваши коммиты будут иметь разные SHA1.Это может быть нежелательно.

0 голосов
/ 04 января 2012

Разве простой мв не сработает? Все 'c' будут отображаться как переименование.

Примерно так: (пожалуйста, не вырезайте и не вставляйте точно так, как я не пробовал это ... просто получите суть ..)

cp -r /someroot/a/b/c /tmp/tmproot/c    # make a full backup of the given repository
rm -Rf /someroot/a/b/c                  # completely remove c, leaving only a/b
mv -r /someroot/a /tmp/tmproot        # moves a/b to the repository
cd /tmp/tmproot
git mv -r c a/b                         # git-moves c into a/b, so all history of c is retained

теперь в вашем каталоге / tmp / tmproot должен быть каталог / b / c с сохраненной историей c

rm /someroot
mv -Rf /tmp/tmproot /someroot               # replace the old rep with your new one

Теперь добавьте все и подтвердите

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