Sign in Join
Wiki copytemporary

git migration

Note: The migration is finished, so this page is kept mainly for historic reference

This page is about migrating FPC from SVN to git

Why?

Why not ?

Concerns/Questions

What part of SVN to migrate ?

Yes, it seems it does. See this StackOverflow topic --Graeme (talk) 14:42, 19 December 2017 (CET)

The SO topic does not help much, but after some experimenting I got git filter-branch --index-filter 'git merge-base --is-ancestor <hash> $GIT_COMMIT ; if [ $? -eq 1 ] ; then git rm --cached --ignore-unmatch <path in repo/file> ; fi' HEAD which removes all revisions of <path in repo/file> which are not ancestor of <hash>. So this removes old versions of files which were cleaned by the commit identified by <hash>. This is reasonable fast (~ 1 hour with my currently converted repository). Afterwards, the file appears to be committed by <hash>. Drawbacks: All history before of the file is lost, also of clean parts. All revisions afterwards get new hashes, so this means, all clones done before must be removed. --FPK (talk) 19:59, 19 December 2017 (CET)

Use git clone --depth 1 to get only the latest revision (with fetch, later on more revisions can be fetched if needed)

Is this really a problem? A git clone of FPC trunk with full history is 50% smaller (disk space usage) than a HEAD revision 'svn co' checkout using SubVersion. --Graeme (talk) 14:36, 19 December 2017 (CET)

It is not: my test respositry is around 500 MB on linux after gc, sources itself are around 350 MB

--FPK (talk) 20:18, 19 December 2017 (CET)

Just checked, only .svn directory of trunk checkout is 800MB If git clone is 500MB it is about 50% smaller. --AlexVinS (talk) 00:35, 20 December 2017 (CET)

But after svn cleanup it gets reduced to 327MB. --Nickysn (talk) 01:19, 20 December 2017 (CET)

With aggressive gc .git gets 425 MB --FPK (talk) 21:32, 21 December 2017 (CET)

And do not forget: using git worktrees, you need only one .git dir for "trunk" and "fixes" --FPK (talk) 21:35, 21 December 2017 (CET)

And I worry mainly about fpcbuild with its non differential history, since my most major disk constraints are VMs for release building Marcov (talk) 15:01, 21 December 2017 (CET)

--depth 1 works with submodules too--AlexVinS (talk) 15:55, 21 December 2017 (CET)

Don't worry too much: fpcbuild trunk .svn: 57.2 MB; full fpcbuild .git: 40.4 MB. So if you are still worried about disk space, we should switch to git asap --FPK (talk) 21:32, 21 December 2017 (CET)

That would resolve my scenario with the biggest (feared) size problems. Marcov (talk) 12:01, 22 December 2017 (CET)

Build repository

The fpc build repository uses svn:external references.

Git has modules, which is in essence the same. This needs to be properly set up.

Branching model ?

Merging model

Merge branches using fast-forward or not ?

The 2 models mentioned below use a different merging technique, fast-forward using merge commit. A hybrid could enforce fast-forward on some branches (notably, the releases branch), see track all remote git branches as local branches

In particular, the command to force fast-forward:

text
git config --add branch.master.mergeoptions --ff-only

How to handle the fixes branch

FPC uses trunk for development. Release are generated from the fixes branch. The fixes branch consists of cherry picked commits from trunk. After a patch proved to be good in trunk, it is cherry picked and committed to the fixes branch. This is a development model which works very well with subversion and is used by FPC for almost 20 years. However, to make this development work well, it requires that the SCM supports cherry pick tracking, something git does not have. So this workflow does not work well with git. Changing the workflow of FPC is not an option at this point, it proved to work, furthermore there are good reasons to use it: When making a patch, it is often hard to know if it is good enough for fixes or not, normally, it is decided after some time or even short before the next release, if a patch is good and safe enough to make it into fixes. This might not happen because it required more changes and those changes got too invasive or because it e.g. turned out that caused incompatibilites which make the patch a candidate for the next minor release instead. So this is probably the key question for a full git migration: can git be used with the workflow fpc uses?

So far, various workflow models exist:

A successful Git branching model

Also known as "git-flow" model.

Advantages

Disadvantages

The cactus model

Also known as the anti-"A successful Git branching Model"

Advantages

Disadvantages

See the Git project itself

Advantages

Disadvantages

User management ?

Git has no concept of users. To manage permissions on a server, a separate program is needed.

gitorious

gitea

Git differentiates between the person that does a commit, and the author of a change/patch. The latter is always available and doesn't need any repository permissions. Somebody with write permissions can commit patches (or merge pull requests) and keep both the Committer and Author information intact. SubVersion doesn't track the author of a change, only the person that did the commit.

What about Lazarus ?

The Lazarus team (Martin Friebe) is currently maintaining a copy of the SVN repo on gitea.

Dependencies on Unix-world tools / ports ?

There seem to be dependencies on quite a few tools common on Unix platforms. Unfortunately, ports of these tools may not be up-to-date and/or working well on non-Unix platforms. As an example, port of GIT 2.13.3 to OS/2 lists dependencies on a Unix shell, Python, Perl and CURL among others. Using Unix shell for launching other programs on a non-Unix platform may have various unwanted effects (remember cygwin ports which we tried to avoid on MS Windows as much as possible for similar reasons). The list of dependencies seems to suggest that quite a few operations require external tools (similarly to merging with early SVN versions). It may be difficult to test all such cases potentially important for certain workflows in advance before the final switch.

OS/2 being the first commercial operating system to ship with Java built-in. So why not simply use the Java version of Git. The Eclipse and IntelliJ IDEA project do on a daily basis. --Graeme (talk) 14:39, 18 December 2017 (CET)

History of OS/2 and Java are one thing, practical usability is another. First, I'm not sure that I want to run Java runtime to commit a change to one file, get a log of recent changes, etc. Second, which JRE version would be necessary for that? Are such JRE versions available for OS/2? --User:Xhajt03

Sorry, another addition - the MS Windows installation of GIT contains a subdirectory with a mingw64 tree (containing a bunch of stuff like bzip2.exe, gettext.exe, antiword.exe, openssl.exe, odt2txt.exe, sqlite3_analyzer.sh or tclsh.exe), plus another subdirectory containing another copy of bzip2.exe plus e.g. gawk.exe, gzip.exe, iconv.exe, nano.exe, perl.exe, sed.exe, ssh.exe, xargs.exe, i.e. a lot of 3rd party tools from various sources, not even mentioning the main bin directory containing bash.exe and sh.exe in addition to git.exe). In total, the Git installation there amounts to 500 MB!!! SVN installation on the same machine is 17 MB, and even the TortoiseSVN (i.e. the GUI addon) is 47 MB. Don't get me wrong, it isn't the size that scares me, but the amount of dependencies. Although many of these tools are probably ported to OS/2 too, they may not be compatible to each other (e.g. requiring different versions of the same DLLs, etc.). :-( I'd need to understand which of the tools are really strictly necessary for regular working with Git (see the section with scenarios on this page).

There is supposedly an rpm package for OS/2 that installs everything you need (for command line git): http://www.edm2.com/index.php/Using_Git_under_eComStation

This is indeed annoying on windows if files like bash or "sh.exe" are in path due to this. Marcov (talk) 13:33, 1 February 2020 (CET)

Misc.

Collected from mails of Marco which is not handled in other sections:

Answer from Chain|Q:

https://help.github.com/articles/github-terms-of-service/

Point "D" caused an uproar a while ago, because some thought that it implied that you're granting GitHub rights to use your content as they see fit. This has been clarified since, I think.

Scenarios to document

SVN scenarios that need an equivalent: (note that equivalency means that changes should be visible on the central server)

text
 git cherry-pick -x -n <commit-id>

<if needed, fix conflicts>

text
 git commit -F .git/MERGE_MSG

is the way to go. This tracks the merged revision in the commit message and it can be search by

text
 git log --grep <commit-id>

if a certain revision is cherry picked.

(New) git specific scenarios

Tool for migration

subgit

Advantages

Disadvantages

git-svn

Advantages

Disadvantages

Work to do

Migrate SVN repo.

Branch mapping for subgit

Proposal for branch mapping

pascal
trunk = trunk:refs/heads/master
branches = branches/merged/*:refs/heads/merged/*
branches = branches/joost/*:refs/heads/joost/*
branches = branches/laksen/*:refs/heads/laksen/*
branches = branches/maciej/*:refs/heads/maciej/*
branches = branches/olivier/*:refs/heads/olivier/*
branches = branches/paul/*:refs/heads/paul/*
branches = branches/*:refs/heads/svn/*
branches = branches/svenbarth/*:refs/heads/svenbarth/*
branches = branches/tg74/*:refs/heads/tg74/*    
tags = tags/*:refs/tags/*
shelves = shelves/*:refs/shelves/*
excludeBranches = branches/aspect
excludeBranches = branches/avr32
excludeBranches = branches/blaise
excludeBranches = branches/cpstr
excludeBranches = branches/cpstrnew
excludeBranches = branches/ctypes
excludeBranches = branches/dodi
excludeBranches = branches/florian
excludeBranches = branches/foxsen
excludeBranches = branches/fcl-web_joost
excludeBranches = branches/generics
excludeBranches = branches/genfunc
excludeBranches = branches/janbruns
excludeBranches = branches/linker
excludeBranches = branches/merged/avr
excludeBranches = branches/merged/generics
excludeBranches = branches/merged/nodeopt
excludeBranches = branches/newthreading
excludeBranches = branches/peterjan
excludeBranches = branches/ssa
excludeBranches = branches/tg74/rtl
excludeBranches = branches/tg74/tests
excludeBranches = branches/tg74/utils
excludeBranches = branches/unitrw
excludeBranches = branches/wkrenn
excludeBranches = branches/FIXES_2_2
excludePath = /fixes_2_0
excludePath = /fixes_2_4
excludePath = /trunk

Set up user management and permissions

Set up and automate github mirror


From the Free Pascal wiki, page "git migration", as it stood on 2022-01-13 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 2, last changed by WikiArchive .

Edited on wiki.freepascal.org by 13 people, 2017–2022

From the official wiki's backup of 26 May 2024: who edited this page there, and when. Edits made there after that date were not recorded, and the earlier versions are not shown here; the main page says why.

WhenWhoWhat changed
MichaelPage in which to discuss SVN to Git migration for FPC
MichaelMigrating from SVN to git
MichaelWhat part of SVN to migrate ?
FPK
MichaelWhat part of SVN to migrate ? (minor)
MichaelMigrate SVN repo.
MichaelWhat part of SVN to migrate ?
GgeldenhuysMore organised workflow section with pros and cons
GgeldenhuysBranching model ?
FPKMigrate SVN repo.
FPKsubgit
FPKThe cactus model
FPKA successful Git branching model
FPKA successful Git branching model
GgeldenhuysSee the Git project itself (minor)
GgeldenhuysA successful Git branching model
GgeldenhuysThe cactus model: - spelling mistake (minor)
GgeldenhuysThe cactus model
PascalDragonExclude most of my branches as they are either merged or not needed anymore
FPKA successful Git branching model
FPKA successful Git branching model
FPKA successful Git branching model
FPKUndo revision 114407 by PascalDragon (talk)
Xhajt03External Unix tools dependencies added
GgeldenhuysDependencies on Unix-world tools / ports ? (minor)
FPKConcerns/Questions
FPKHow to handle the fixes branch
FPK
FPKMisc.
MarcovWhat part of SVN to migrate ?: obliterate remark. This problem is known, and all projects deal with it from time to time. Also long time on svn wishlist-postponed-to-next-major-version
GgeldenhuysWhat part of SVN to migrate ?: comment added (minor)
GgeldenhuysWhat part of SVN to migrate ?: link on how to remove a file from the git history. (minor)
FPKWhat part of SVN to migrate ?
FPKWhat part of SVN to migrate ?
FPKWhy?
FPKWhy?
AlexVinSWhat part of SVN to migrate ?
NickysnWhat part of SVN to migrate ?
MarcovWhy?: typo (minor)
Marcov
MarcovMisc.
AlexVinSWhat part of SVN to migrate ?
FPKWhat part of SVN to migrate ?
FPKWhat part of SVN to migrate ?
MarcovWhat part of SVN to migrate ?
MarcovWhat part of SVN to migrate ?
FPKBranch mapping for subgit
FPKBranch mapping for subgit
Marcov (minor)
MarcovScenarios to document: fix nesting (minor)
MarcovWhy?
MarcovUser management ?
MarcovScenarios to document
GgeldenhuysScenarios to document: git command suggestions.
GgeldenhuysSet up and automate github mirror (minor)
GgeldenhuysUser management ?
JwdietrichCategorization
MarcovWhy not ?
MarcovWhy not ? (minor)
MarcovSee the Git project itself
MarcovA successful Git branching model
MarcovScenarios to document
MarcovScenarios to document
MarcovWhy not ?
MarcovWhy not ?
MarcovWhy not ?
MarcovMisc.
NickysnScenarios to document
NickysnScenarios to document
NickysnScenarios to document
NickysnWhy not ?: - I also don't use git
MarcovScenarios to document
MarcovMisc.: typo (minor)
FPKScenarios to document
MichaelBranching model ?
MichaelWhat about Lazarus ?
MichaelWhat about Lazarus ?
Xhajt03Additional scenarios to be documented
Xhajt03Dependencies on Unix-world tools / ports ?
Xhajt03extended previous comment regarding 'git gui' suggestion (minor)
Xhajt03Additional observation about Git dependencies
Jonas
Xhajt03'svn export' added to the list of scenarios
NickysnSVN scenarios that need an equivalent: (note that equivalency means that changes should be visible on the central server)
NickysnSVN scenarios that need an equivalent: (note that equivalency means that changes should be visible on the central server)
AlexVinSSVN scenarios that need an equivalent: (note that equivalency means that changes should be visible on the central server)
AlexVinSSVN scenarios that need an equivalent: (note that equivalency means that changes should be visible on the central server)
MarcovDependencies on Unix-world tools / ports ?
ArentBranching model ?: readability
Arent
ArentSee also
TrevFix heading levels (minor)
TrevSee also: Fix typo (minor)
MarcovWhy not ?: safety, can corruption be pushed?
MarkMLlWhy not ?: Loses simple "fixed from" concept
ArentWhat about Lazarus ?
FPK
TrevSee also: Remove reference to defunct git mirror (minor)

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.