2009-04-14 11 views
8

Byłem bardzo niegrzeczny. Od pewnego czasu pracuję nad oprogramowaniem (jestem jedynym programistą) (O.K., trwa to kilka lat), ale nie korzystałem z żadnej kontroli źródła.Jak mogę przekonwertować proste kopie zapasowe projektu kontrolowanego przez inne niż źródłowe do wersji repozytorium git?

ja postanowiłem użyć kontroli źródła (git wydaje się najbardziej prawdopodobny, jako narzędzia okna wydają się pochodzić od wielu na przestrzeni ostatnich kilku miesięcy) od teraz. To, co mam, to datowane kopie zapasowe całego katalogu mojego (.NET) rozwiązania.

Co chcę zrobić, to automagicznie wyświetlić kopie zapasowe w historii zmian. To będzie bałagan. Projekty i pliki zostaną dodane/usunięte w trakcie historii rozwiązania. Nie przejmuję się problemami, o których wiem, że są przemianowane na pliki interpretowane jako usuwanie pliku i dodanie nowego, niespokrewnionego.

Generalnie moim problemem jest: Mam czas uporządkowany kopie zmieniającego się katalogu. Importowanie pierwszego do git jest łatwe, zakładam. Ale chcę, aby wszystkie kolejne kopie katalogu były scalane, w porządku doraźnym, pojedynczo, bez konieczności zatwierdzania każdego podkatalogu i pojedynczego pliku.

Czy to możliwe, czy też po prostu jestem karany za to, że nie korzystam z kontroli kodu źródłowego?

Edytuj: Jeśli ręcznie wykonam ręcznie metodę "Zatwierdź wszystkie migawki indywidualnie" (jest ich mniej niż 20), czy istnieje sposób (jak sugeruje Esko Luontola) nadpisania dat zatwierdzenia daty mam dla migawki. git commit nie ma flagi zezwalającej na to. Czy istnieje inny sposób (używam Vista)?

Edytuj: W odpowiedzi na mój problem używania oryginalnych dat: Musisz ustawić zmienne środowiskowe GIT_AUTHOR_DATE i/lub GIT_COMMITER_DATE, aby nadpisać użycie aktualnych dat i czasów podczas wykonywania zatwierdzenia.

Powodem są dwa zestawy zmiennych (są też GIT_ (AUTOR | COMMITER) _ (NAZWA | DATA | EMAIL)) to rozróżnienie między, powiedzmy, autorem, który wysyła e-maile z łatką, a opiekunem, który jest faktycznie robi commits na repozytorium.

Uwaga, jeśli używasz rozszerzeń git na VS: Jeśli ustawisz (wyeksportuj zmienną = "wartość") te zmienne za pomocą wiersza poleceń "git bash", a następnie przełączysz się z powrotem do GUI w celu wykonania zatwierdzenia, wydaje się, że ignorujesz im. Musisz pozostać w wierszu poleceń i uruchomić "git commit".

+0

Czy chcesz mieć również rzeczywiste daty w repozytorium Git? Przynajmniej zrobili coś takiego, przenosząc 20 lat historii Perla do Git: http://github.com/blog/276-perl-mirror-on-gitub –

+0

Nie dotyczy: przenoszenie historii Perla do Git było importowane z Perforce –

Odpowiedz

5

Nie może być już zautomatyzowany sposób to zrobić, ale git powinny być na tyle silny, aby dać Ci git init w swojej najstarszej kopii zapasowej, a następnie wielokrotnie skopiować folder .git aby stopniowo nowe kopie zapasowe i stworzyć popełnić ze wszystkim dla każdego z nich. Skryptowanie powinno być całkiem łatwe.

Jeszcze lepiej, możesz przekazać opcję --git-dir= lub zmienną środowiskową $GIT_DIR do git i poprosić o użycie repozytorium, zapisując krok kopiowania.

coś takiego:

cd $FINAL_DIR 
git init 

export GIT_DIR=$FINAL_DIR/.git 

cd $NEXT_BACKUP 
git add -A . 
git commit 
# rinse and repeat 
+0

Sugeruję użycie "git add -A". i nie daje "-a" do zatwierdzenia git, wydaje się nieco jaśniejsze ... jeśli twoja wersja git dodaje obsługę -A, to jest. Alternatywnie, "git add." a następnie "git add -u" (aby śledzić zarówno nowe, jak i usunięte pliki). – araqnid

3

Nie bardzo wiem, dlaczego nie chcesz po prostu popełnić wszystkie zrzuty indywidualnie. Chodzi mi o to, że skrypt powłoki (lub Perl, Python, Ruby, Tcl, cokolwiek) do tego, jest prawdopodobnie mniej niż 5 linii kodu i mniej niż 10 minut pracy.

Ponadto, istnieje git load-dirs, które pozwalają na cięcie, które być może aż do linii 3 i 5 minut.Ale wciąż musisz załadować każdy rejs z osobna.

Ale jeśli jesteś tak pochłonięty, istnieje narzędzie git fast-import, które ma na celu ułatwienie pisania konwerterów i importerów repozytoriów. Według strony podręcznika można napisać importera w około 100 liniach i kilku godzinach.

Jednak to wszystko ignoruje największy problem: wartość z VCS leży nie w treści - można równie dobrze użyć regularnych kopii zapasowych - ale w komunikatach popełnić. I żadne magiczne narzędzie ci tam nie pomoże, będziesz musiał wpisać je wszystkie w siebie ... a co ważniejsze, będziesz musiał dokładnie pamiętać, że dokonałeś każdej małej zmiany w ciągu ostatnich lat.

+1

Istnieją przykładowe skrypty szybkiego importu w contrib/fast-import /, w tym import-zip.py (w Pythonie) i import-tars.perl (w Perlu). –

+1

-1 Nie sądzę, że ta odpowiedź jest pomocna, to jest jak "koleś, jesteś idiotą, to takie proste, po prostu zrób to, chodź, mogę to zrobić w 2 minuty z zamkniętymi oczami" – hasen

7

Można Przykład zastosowania git-fast-import narzędzi opartych rozproszonych w git.git repozytorium: import-zips.py(w Pythonie) lub import-tars.perl(w Perl) lub użyć tych skryptów jako podstawy własnego scenariusza importu. Te skrypty można znaleźć w katalogu contrib/fast-import/.