Source Control Migration from Accurev to Git (.net)

905 views Asked by At

Currently we have a big project, about 10GB (including dlls), probably around 5GB without dlls, in Accurev and it is really slow to get / up / promote etc...

We are thinking of migrating to GIT, but biggest problem is it is a big monolith plus the way it is structured, we have one DEPOT for all projects. We have a LIBRARY folder where all the projects are built to, instead of the bin folder, so libraries references could be shared. Every library is built to that LIBRARY folder, and all inter project references are referencing the dlls in the LIBRARY folder.

How can we start to chunk out the project and migrate to GIT? I was thinking of setting up an internal NUGET SERVER and NUGET-ting the current common libraries first, put them on GIT...then slowly migrate others over, splitting projects per repo, not a single repo (depot) like now.

Any suggestions?

1

There are 1 answers

1
nonsensickle On BEST ANSWER

You could use the script I wrote, ac2git, to convert your repo to git but it might take a while.

After the conversion you could use the git filter-branch --subdirectory-filter to separate the converted monolith git repo into per project git repos.

It should work but it will probably be slow.

Alternatively, if you're up for it, you could modify my script to do what you want. You would just need to make sure that it runs the accurev pop command only on the directories that you're interested in while it is converting the repo which would make it quicker per project but the same speed over all.

Edit:

If you decide that you want to only convert a single folder at a time it would be trivial for you to hard code the script to do what you want. All you need to do is modify all the calls to accurev.pop() (of which there is only one in the AccuRev2Git.TryPop() function) and add another argument to the call specifying which folder you wish to populate.

def TryPop(self, streamName, transaction, overwrite=False):
    for i in xrange(0, AccuRev2Git.commandFailureRetryCount):
        # --- Remove this line --- #
        #popResult = accurev.pop(verSpec=streamName, location=self.gitRepo.path, isRecursive=True, isOverride=overwrite, timeSpec=transaction.id, elementList='.')
        # --- And add this instead --- #
        popResult = accurev.pop(verSpec=streamName, location=self.gitRepo.path, isRecursive=True, isOverride=overwrite, timeSpec=transaction.id, elementList='/./<your project folder>')
        # --- End hardcoding hack --- #
        if popResult:
            break
        else:
            self.config.logger.error("accurev pop failed:")
            for message in popResult.messages:
                if message.error is not None and message.error:
                    self.config.logger.error("  {0}".format(message.text))
                else:
                    self.config.logger.info("  {0}".format(message.text))

    return popResult