конвертирование только частей хранилища Subversion из git - PullRequest
4 голосов
/ 22 марта 2011

У меня есть старый репозиторий Subversion с множеством моих частных проектов.Некоторые его части были конвертированы из старого хранилища CVS несколько лет назад (с помощью cvs2svn или аналогичного).Его текущая структура выглядит следующим образом:

  • транк
    • латекс
    • java
      • awt-doku
      • pps
        • build.xml
        • src
          • ant
          • de
            • dclj
            • faq
            • Пол
              • (около 20 других пакетов)
              • ltxdoclet
                • (некоторые файлы Java)
    • lua
    • (другие каталоги)
  • ветки
  • метки
  • import
Проблема в том, что я провел довольно реорганизацию этого хранилища - например, все содержимое pps каталог был когда-то в подкаталоге import (кажется, я импортировал его туда из CVS), и, возможно, были и другие движения.

Меня сейчас интересует содержимоекаталога ltxdoclet вместе с некоторыми другими файлами по пути, такими как build.xml,Каталог ant и так далее.И я хочу иметь всю их историю, включая любую историю, прежде чем перемещать файлы.И я хочу сейчас это как репозиторий git (поскольку я хочу опубликовать это на github).Тэги и ветки никогда не использовались, поэтому они не важны.

Я не хочу, чтобы остальная часть этого репозитория (иногда они получат отдельные репозитории git) - это слишком сильно взорвет мой репозиторий (и есть кое-что, что я не хочу публиковать).

В идеале мой полученный git-репозиторий (в состоянии HEAD) должен выглядеть следующим образом:

  • pps
    • build.xml
    • src
      • ant
      • de
        • dclj
          • paul
            • ltxdoclet
              • (некоторые файлы Java)
Меня не особо волнуют исторические конфигурации каталогов, но история не должна содержать коммитов, которые не касались ни одного из файлов в этих каталогах (или их предшественников).

OfКонечно, git svn кажется инструментом выбора.(Есть ли другие?)

git svn clone кажется правильной командой ... но с какими опциями?Я создал authors.txt для преобразования имен пользователей CVS или SVN в мои имя и адрес.Чтобы иметь только интересные файлы и каталоги, я использую --ignore-paths.

Это была моя попытка:

filter='^/xcb-src/|_00|src/resources|dclj/faq|dclj/paul/([^l]|l[^t])'
git svn clone svn+ssh://mathe-svn/ --trunk trunk/java/pps -A authors.txt --ignore-paths=$filter latexdoclet

Конечно, он показывает только историю после коммита 2306, когда я переехалimport/java-pps до trunk/java/pps ... и в нем много коммитов, которые вообще не меняются.

Чтобы решить первую проблему, я подумал о том, чтобы присвоить старому каталогу также --trunk:

git svn clone svn+ssh://mathe-svn/ --trunk trunk/java/pps --trunk import/java-pps -A authors.txt --ignore-paths=$filter latexdoclet

Это не работает, первый --trunk здесь игнорируется, и он эффективно заканчивается при коммите 2305 (до перемещения).(И он также содержит много пустых коммитов.)

Моя текущая попытка - импортировать весь репозиторий, отфильтровывая все ненужное:

filter='/xcb-src/|_00|src/resources|dclj/faq|dclj/paul/([^l]|l[^t])|/esperanto|finanzen|diverses|homepage|konfig|lua|prog-aufgaben|CVSROOT|latex|tags/'
git svn clone svn+ssh://mathe-svn/ -A authors.txt --ignore-paths=$filter latexdoclet-neu

Преобразование все еще выполняется, но тамконечно, много коммитов я вообще не хочу.

Редактировать: преобразование завершено - у меня сейчас 2658 коммитов (3176 объектов в git), и только у 36 из них есть некоторые интересные изменения дерева, если янастроил мой фильтр gitk правильно.(+ еще около 3, которые были ошибочно отфильтрованы, поскольку наш исходный латексный файл был сначала в каталоге latex.)


  • У кого-нибудь есть лучшие идеи, как это сделать?
  • Должен ли я лучше сначала импортировать весь репозиторий, а затем использовать git filter-branch, чтобы выбрать нужные файлы и коммиты?

Ответы [ 2 ]

4 голосов
/ 22 марта 2011

Вот что я сделал, для справки.


После ответа Дастина я сначала преобразовал весь svn-репозиторий в git с помощью

 git svn clone -A authors.txt svn+ssh://mathe-svn/ all-projects

Это дало мне довольно большой репозиторий git с 24241 объектами и 24 МБ (после упаковки) из репозитория git 45 МБ. Как уже говорилось в комментарии, у обоих было 2658 коммитов в линейной истории, поэтому до сих пор ничего не было потеряно.

Затем я начал отфильтровывать вещи ... из фильтров, предлагаемых git filter-branch , --index-filter, похоже, был наиболее полезным, так как не нужно ничего проверять ( по сравнению с --tree-filter), и я не хотел переписывать метаданные, только удалить ненужные файлы.

Кроме того, --prune-empty также будет полезен. Я также использовал -d /dev/shm/ebermann/git-work/tmp, чтобы поместить рабочий каталог в tmpfs, но я не знаю, действительно ли это имело значение, так как здесь я не делал проверки. Я использовал опцию --original, чтобы сохранить исходную ссылку master под новым именем. (Почему filter-branch не позволяет просто создать новую ветку и оставить старую неповрежденной?)

В качестве моего древовидного фильтра я использовал git rm --cached -r --ignore-unmatch, к которому я подал список файлов и каталогов на xargs.

Итак, у меня было несколько вызовов

git filter-branch           \
  -d /dev/shm/ebermann/git-work/tmp  \
   --index-filter "
xargs -a ~/projektoj/git-conversion/remove-liste-5.txt git rm --cached -r --ignore-unmatch 
"        \
   --original "step8"       \
   master

и

git filter-branch \
  -d  /dev/shm/ebermann/git-work/tmp  \
  --prune-empty \
  --original "step9" \
  master

Между тем, я посмотрел на созданную ветку с gitk, ища файлы, которые я забыл ранее. Первый список файлов, который я создал из вывода svn ls svn+ssh://mathe-svn/path, удаляя файлы / каталоги, которые я хотел сохранить. Позже мне пришлось повторить это для более старых версий, поскольку некоторые файлы были переименованы (или, точнее, целые деревья каталогов были перемещены) раньше, поэтому старые имена не отображались. Также некоторые файлы были удалены до текущей версии.

Теперь моя ветка master уменьшена до 40 ревизий, а мой HEAD содержит 39 файлов и каталогов.

Репозиторий (только эта ветка клонирована в новом репозитории) теперь имеет размер всего 180 КБ (с рабочим деревом 288 КБ). Теперь я пойду и уберу комментарии коммита (которые часто не имеют никакого отношения к этому проекту), а затем опубликую их на github.


В следующий раз, есть какая-то команда, которая создает список всех путей к файлам, которые когда-либо существовали в моем хранилище (без проверки всех ревизий и для каждого вызова find или такого) ? (Либо для git, либо для svn все будет в порядке.)

3 голосов
/ 22 марта 2011

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

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