Achters met terugwerkende kracht corrigeren met Git SVN?

Ik heb een repository die ik alheb gekloond van Subversion. Ik heb wat werk gedaan in deze repository in zijn Git-vorm en ik zou het vreselijk vinden om die structuur te verliezen door opnieuw te klonen.

Toen ik de repository echter oorspronkelijk kloonde, heb ik de eigenschap svn.authorsniet correct gespecificeerd (of een semantisch vergelijkbare optie).

Is er een manier waarop ik de SVN-auteurstoewijzingen kan specificeren nu de repository volledig Git-ified is?

Bij voorkeur zou ik alle oude commit-auteurs willen corrigeren om de Git-auteur te vertegenwoordigen in plaats van de onbewerkte SVN-gebruikersnaam.


Antwoord 1, autoriteit 100%

Begin door te kijken wat u moet opruimen:

git shortlog -s

Maak voor elk van die namen een item in een script dat er als volgt uitziet (ervan uitgaande dat je wilt dat alle auteurs en committers hetzelfde zijn):

#!/bin/sh
git filter-branch --env-filter '
n=$GIT_AUTHOR_NAME
m=$GIT_AUTHOR_EMAIL
case ${GIT_AUTHOR_NAME} in
        user1) n="User One" ; m="[email protected]" ;;
        "User Two") n="User Two" ; m="[email protected]" ;;
esac
export GIT_AUTHOR_NAME="$n"
export GIT_AUTHOR_EMAIL="$m"
export GIT_COMMITTER_NAME="$n"
export GIT_COMMITTER_EMAIL="$m"
'

Dat is eigenlijk het script dat ik onlangs heb gebruikt voor een grote herschrijvingwas heel erg zoals je beschreef (behalve dat ik een groot aantal auteurs had).

bewerkenGebruik π wees op een probleem met aanhalingstekens in mijn script. Bedankt!


Antwoord 2, autoriteit 19%

git filter-branchkan worden gebruikt om grote stukken geschiedenis te herschrijven.

In dit geval zou je waarschijnlijk iets doen als (totaal niet getest):

git filter-branch --env-filter '
    GIT_AUTHOR_NAME=`echo "${GIT_AUTHOR_NAME}" | sed -e "s/svnname1/Right Name/; s/svnname2/Correct Name/"`
    GIT_COMMITTER_NAME=`echo "${GIT_COMMITTER_NAME}" | sed -e "s/svnname1/Right Name/; s/svnname2/Correct Name/"`
    GIT_AUTHOR_EMAIL=`echo "${GIT_AUTHOR_EMAIL}" | sed -e "s/svnname1/[email protected]/; s/svnname2/[email protected]/"`
    GIT_COMMITTER_EMAIL=`echo "${GIT_COMMITTER_EMAIL}" | sed -e "s/svnname1/[email protected]/; s/svnname2/[email protected]/"`
'

Zoals altijd geldt het volgende: om de geschiedenis te herschrijven, heb je een nodig samenzwering.


Antwoord 3, autoriteit 5%

Je wilt waarschijnlijk kijken naar git-filter-branch, met name de optie --commit-filter. Deze opdracht is een krachtige kettingzaag die je hele repositorygeschiedenis kan herschrijven, en alles kan veranderen wat je maar wilt veranderen.

Houd er rekening mee dat wanneer u dit doet, u nieuwe klonen uit de bijgewerkte repository moet halen, aangezien de SHA1-hashes van elke commit mogelijk zijn gewijzigd.

Other episodes