Jak zaimportować repozytorium CVS do Gita

Instalujemy konsolę Babun, uruchamiamy ją i instalujemy potrzebne narzędzia:

pact install git-cvs

Logujemy się, aby uniknąć konieczności podawania za każdym razem hasła (zamień anonymous na swój login):

cvs -d :pserver:anonymous@cvs.server.address.com:/cvs/project_name login

Importujemy repozytorium:

git cvsimport -C directory -r cvs -k -d :pserver:anonymous@cvs.server.address.com:/cvs/project_name module_name

Importowanie dużego repozytorium, może potrwać nawet kilka lub kilkanaście godzin.

Kiedy import się zakończy możemy w pełni korzystać z możliwości Gita. Na początek proponuję przejrzeć istniejące gałęzie:

git branch --all

Powinniśmy otrzymać wynik zbliżony do:

> master
> remotes/cvs/critical_bug_fix
> remotes/cvs/new_window_feature
> remotes/cvs/HEAD -> cvs/master
> remotes/cvs/master

Załóżmy, że chcemy pracować na gałęzi „new_window_feature”. Każda zmiana musi zostać zachowana w lokalnej gałęzi, zanim wyślemy ją na serwer CVS, więc tworzymy ją:

git checkout -b new_window_feature remotes/cvs/new_window_feature

Teraz możemy pracować, przeglądać historię zmian itd. Po zakończonej pracy, ale przed wysłaniem zmian na serwer, należy upewnić się, że mamy najnowszą kopię kodu, a jeżeli ktoś w między czasie wysłał swoje zmiany na serwer, pobrać je. Służy do tego polecenie „git cvsimport”. Zanim ponownie go użyjemy, zapiszemy w konfiguracji kilka parametrów, aby ułatwić sobie przyszłą pracę:

git config --local cvsimport.module module_name
git config --local cvsimport.r cvs
git config --local cvsimport.d :pserver:anonymous@cvs.server.address.com:/cvs/project_name

Powyższe parametry są dokładnie takie same jak te, które podawaliśmy przy imporcie repozytorium. Przed importem zmian, musimy przejść na gałąź „master” (może istnieje inny sposób, ale na chwilę obecną go nie znam):

git checkout master
git cvsimport

Po pobraniu zmian, korzystamy z polecenia „rebase”, aby uaktualnić naszą wersję:

git checkout new_window_feature
git rebase remotes/cvs/new_window_feature

Pobieranie repozytorium i synchronizacja zmian z serwera CVS do nas jest prosta i dość oczywista. Niestety, wysyłanie naszych zmian na serwer CVS już nie.

Aby wysłać własne zmiany na serwer CVS, musimy wcześniej pobrać kopię roboczą repozytorium przy pomocy klienta CVS, a następnie każdą rewizję przenosić do z kopii roboczej Gita do kopii roboczej CVS:

cvs -d :pserver:anonymous@dcvs.server.address.com:/cvs/project_name checkout module_name

W czasie gdy CVS pobiera repozytorium, wyszukujemy w logu hashe rewizji, które chcemy wysłać na serwer CVS:

git log

Zapisujemy hash:

> commit b3e7es855e43baba2b28521b619f7387a3ee4373
> Author: Jan Kowalski <jan@kowalski.pl>
> Date: Tue Jul 7 08:47:48 2015 +0200
> Fixed code formatting.

Eksportujemy zmiany:

git cvsexportcommit -v -w /path/to/csv/working/copy b3e7es855e43baba2b28521b619f7387a3ee4373

W wyniku powinniśmy otrzymać:

> Applying to CVS commit b3e7es855e43baba2b28521b619f7387a3ee4373from parent ea7964b788e69382ec81d2e1d2d98bd3a21c203f
> Checking if patch will apply
> Applying
> Patch applied successfully. Adding new files and directories to CVS
> Commit to CVS
> Patch title (first comment line): Fixed code formatting.
> Ready for you to commit, just run:
> cvs commit -F .msg 'path/to/changed/file.cpp'

Ostatnia linia, to polecenie które musimy wykonać, aby wysłać zmiany na serwer CVS:

cvs commit -F .msg 'path/to/changed/file.cpp'

Linki

https://stackoverflow.com/questions/23109027/authreply-i-hate-you-response-while-using-git-cvsimport

https://stackoverflow.com/questions/11362676/how-to-import-a-cvs-repository-in-git-and-use-it-locally

https://stackoverflow.com/questions/584522/how-to-export-revision-history-from-mercurial-or-git-to-cvs/586225#586225

https://stackoverflow.com/questions/11478353/git-cvsexportcommit-pserver-fails

https://lists.gnu.org/archive/html/info-cvs/2004-08/msg00135.html

Ten wpis został opublikowany w kategorii CVS, Git. Dodaj zakładkę do bezpośredniego odnośnika.