Разделение папок в репозитории git на отдельные ветки - PullRequest
6 голосов
/ 12 февраля 2012

Я наконец-то перенес наш репозиторий CVS в git.К сожалению, мы не использовали ветви в CVS, но разные версии / ветви были разделены на разные подкаталоги.

IE, у нас следующая структура каталогов:

/root
    /lib
    /tools
    /src
        /v1.0
        /v2.0
        /v3.5

Есть ли способ отделить3 версии в подкаталоге src в отдельных ветках вместо хранения каталога для каждой версии?

Я нашел такой же вопрос здесь, в переполнении стека Вопрос 4877053 , где использование git-subtreeпредлагается, но даже после прочтения руководства по git-subtree я не понял, как его использовать для решения моей проблемы.

Может кто-нибудь дать мне более подробное объяснение или даже другое решение?

Я совершенно новичок в git, возможно, поэтому я не понял руководство по поддереву; -)

Большое спасибо за все ваши ответы!

1 Ответ

3 голосов
/ 02 марта 2012

Это зависит от того, что вы хотите оставить в хранилище впоследствии.

Если вы хотите три ветви, v1.0, v2.0, v3.5, все со структурой, подобной этой:

/root
    /lib
    /tools
    /src

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

-- A -- B -- Current 
              | 
              |--- v1.0
              |--- v2.0
              |--- v3.5

A, B, Current - это коммиты, которые вы зафиксировали с момента перехода на git, и где v1.0, v2.0 и v3.5 по сути являются "тупиковыми" ветвями. Вы могли бы сделать несколько причудливых вещей, если вы хотите получить структуру веток, например:

-- v1.0 --- v2.0 --- v3.5 -- A -- B -- Current

То есть разделите v1.0, v2.0 и v3.5 на их собственные ветви, затем переместите v1.0 на v2.0, v2.0 на v3.5 и v3.5 на первый коммит в текущей версии.

Но я не совсем уверен, что вы хотите сделать.


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

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

  1. git checkout -b v1.0 - попасть в новую ветку.
  2. Удалить все, кроме v1.0. Есть несколько способов сделать это. Этот вопрос имеет несколько методов для удаления всего, кроме; Я не мог заставить их работать на меня, это могло бы работать лучше для вас.

    `git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch src/v2.0" --prune-empty -f`
    

    Это удалит src/v2.0 и всю связанную историю из ветви. -f не требуется для этого фильтра; но git-filter-branch делает какое-то резервное копирование (прочитайте справочную страницу?), и это может привести к ошибкам. Это будет вызывающе во второй раз, когда вы попробуете git filter-branch.

    Повторите это, чтобы удалить также src/v3.5.

    Это оставит вас с src/v1.0. Возможно, вы захотите изменить источник с src/v1.0 на src; Вы можете запустить git filter-branch --subdirectory-filter (прочитайте страницу руководства), чтобы получить структуру каталогов /v1.0-files (не содержит ничего, кроме файлов из подкаталога v1.0; переместил содержимое из v1.0 в root), а затем посмотреть в примерах на странице man git-filter-branch (в частности, в нижнем примере), чтобы переместить файлы в подкаталог. Это может быть излишним, и вам нужно будет слить , который , в ветвь, содержащую все остальные вещи, которые git filter-branch --subdirectory отбраковал; простой mv v1.0/* . может сработать, но тогда в вашей истории будет еще один коммит. Я не знаю, что ты предпочитаешь.

    Итак, теперь у вас есть v1.0 в его собственной ветке. Yay!

  3. Повторите для v2.0 и v3.5.

Боюсь, я не вижу, чтобы это что-то делало, кроме как дать вам ... "странную" историю, хотя. Предположительно v2.0 имеет, по существу, v1.0 + улучшения; структура, которую я перечислил выше (три «тупиковые» ветви), показывает, что v2.0 и v3.5 не основаны на предыдущих версиях. Я не совсем уверен, какая у вас история, если это проблема и т. Д. И т. Д.

Поскольку у вас есть v1.0, v2.0 и v3.5 в их собственных маленьких ветвях, вы можете git merge их или git rebase и т. Д. И т. Д., Если вы предпочитаете более приятную историю.

Надеюсь, это даст вам немного подумать; как я уже сказал, пожалуйста, прочитайте справочные страницы . :)

...