Почему в git-svn теряется много ревизий? - PullRequest
0 голосов
/ 16 мая 2019

В настоящее время я пытаюсь переместить несколько проектов из SVN в GIT с помощью GIT-SVN. Независимо от того, какой проект я пытаюсь преобразовать, svn-версий гораздо больше, чем коммитов git. Я действительно не знаю SVN, поэтому мне трудно понять, почему это происходит.

Я в основном следовал этому руководству по конвертации. Потери на пути варьировались от 18 ревизий до 9 коммитов, от 131 ревизии до 10 коммитов в git. Это произошло в проектах как с множеством веток, так и без них.

До сих пор я пытался использовать опцию --stdlayout ( Отсутствуют ревизии после "git svn clone" ). Я также попытался использовать svn2git , однако это также не удалось, вероятно потому, что мои проекты не имеют инфраструктуры, необходимой для svn2git (отсутствуют файлы формата и db). Я думаю, что в конце концов я найду способ сделать это, используя любой из других доступных инструментов (например, this ), но я просто хотел бы знать, почему это происходит.

Итак: кто-нибудь знает, почему так много ревизий не отображается в истории коммитов при использовании git-svn для преобразования svn-репозиториев в git? Git-svn просто глючит или есть какие-то типы ревизий, которые просто не отображаются в истории git commit?

Обновление

С тех пор я узнал, что svn log - вопреки git log - показывает все ревизии в истории, а не только те, которые находятся в стволе / мастере. Это означает, что многие из ревизий, которые я считал отсутствующими, на самом деле были только в ветках. Однако, несмотря на это, не все ревизии находятся в истории коммитов. Отсутствуют те, которые отображаются при вызове svn log, например. внутри \branches (но не внутри одной из ветвей). git-svn, вероятно, не импортирует их, потому что они не влияют ни на master, ни на какие-либо ветви. Хотя теперь это ясно для меня, я все еще немного растерялся относительно значимости этого. Важны ли эти ревизии или история git без них хороша?

Обновление 2

Файл .git / config

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    ignorecase = true
[svn-remote "svn"]
    noMetadata = 1
    url = svn://TheURL/TheRepository
    fetch = trunk:refs/remotes/svn/trunk
    branches = branches/*:refs/remotes/svn/*
    tags = tags/*:refs/remotes/svn/tags/*
[svn]
    authorsfile = /a/file/path/svn/authors-transform.txt
[remote "origin"]
    url = https://github.com/User/TheRepository.git
    fetch = +refs/heads/*:refs/remotes/origin/*

Структура файла:

TheRepository
|
+--branches
|  |
|  +--branchA
|  |
|  +--Readme_branch.txt
|
+--trunk
|
+--tags

1 Ответ

0 голосов
/ 22 мая 2019

Итак, сегодня я узнал (благодаря eftshift0):

1.svn log и git log показывают разные вещи

svn log вернет все ревизии, сделанные в любых подкаталогах, в которых вы находитесь. Так что если вы находитесь в корневом каталоге, он покажет все изменения, сделанные во всех ветвях,багажник и метки.Это не похоже на git log, который показывает только коммиты, сделанные в ветке, в которой вы находитесь.Это может показаться очевидным, если вы знаете SVN, но я не знал, так что ...

2.Что делает --stdlayout

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

Эти два факта были причинами, по которым коммиты, которые я отличал от ревизий.Я надеюсь, что эта информация будет полезна кому-то еще однажды :)

...