Mam kopię roboczą projektu, bez metadanych kontroli źródła. Teraz chciałbym zrobić odpowiednik git-clone w tym folderze i zachować moje lokalne zmiany.
git-clone nie pozwala mi klonować do istniejącego folderu. Jaka jest tutaj najlepsza praktyka?
Mam kopię roboczą projektu, bez metadanych kontroli źródła. Teraz chciałbym zrobić odpowiednik git-clone w tym folderze i zachować moje lokalne zmiany.
git-clone nie pozwala mi klonować do istniejącego folderu. Jaka jest tutaj najlepsza praktyka?
Odpowiedzi:
Można to zrobić poprzez klonowanie do nowego katalogu, a następnie przeniesienie .gitkatalogu do istniejącego katalogu.
Jeśli twój istniejący katalog nosi nazwę „kod”.
git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp
Można to również zrobić bez robienia kasy podczas polecenia klonowania; więcej informacji można znaleźć tutaj .
git clonejako pierwszego polecenia, dalsze polecenie pobierania nie jest konieczne. Jeśli zamiast tego użyjesz czegoś takiego jak git clone --no-checkoutw pierwszym kroku, po przeniesieniu katalogu .git konieczne będzie użycie git reset HEADpolecenia poinformowania gita, że pliki nie zostały usunięte.
git status.
Nie klonuj, pobierz zamiast. W repozytorium:
git init
git remote add origin $url_of_clone_source
git fetch origin
git checkout -b master --track origin/master # origin/master is clone's default
Następnie możesz zresetować drzewo, aby uzyskać żądane zatwierdzenie:
git reset origin/master # or whatever commit you think is proper...
i jesteś jak sklonowany.
Interesujące pytanie tutaj (i jedno bez odpowiedzi): jak dowiedzieć się, na którym podstawie opierało się twoje nagie drzewo, a zatem na której pozycji zresetować.
Wykonałem następujące czynności, aby dokonać transakcji oddziału master w istniejącym katalogu:
git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft
-tużyto tu flagi?
Przejdę git clonedo nowego katalogu i skopiuję zawartość istniejącego katalogu do nowego klonu.
git clone wherever tmp && git mv tmp/.git . && rm -rf tmpInnymi słowy, przeniesienie katalogu .gitpoza tymczasowy klon wydaje się prostsze niż wyczyszczenie działającego drzewa klonowania i skopiowanie tam istniejących plików.
git mv tmp/.git .wraca fatal: cannot move directory over file, source=tmp/.git, destination=.gitpo mnie. Czy ktoś wie, na czym polega problem?
mv, a nie git mv; chociaż to nie wyjaśnia, dlaczego masz .gitjuż plik (zawierający gitdir: some/path/to/a/git-dir„gitfile”; gdyby go nie było, zobaczyłbyś fatal: Not a git repository (or any of the parent directories): .gitzamiast tego).
Korzystanie z katalogu tymczasowego jest w porządku, ale zadziała, jeśli chcesz uniknąć tego kroku. Z katalogu głównego katalogu roboczego:
$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master
git reset --hard origin/masterusunie wszystkie lokalne pliki.
hardi mixedpolega na tym, że mieszane zachowa zmiany lokalne (więc jeśli spróbujesz później go wyciągnąć, pokaże Ci np. Nie można wyciągnąć z rebase: masz zmiany niestabilne. Zatwierdź je lub ukryj ) , podczas gdy twardy odrzuci te lokalne zmiany
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed
git reset --hardspowoduje zmianę lokalnych plików, szczególnie NIE o to poprosił ten OP. --mixednależy zamiast tego użyć.
Aby sklonować repozytorium git w pustym istniejącym katalogu, wykonaj następujące czynności:
cd myfolder
git clone https://myrepo.com/git.git .
Zwróć uwagę .na koniec git clonepolecenia. Spowoduje to pobranie repozytorium do bieżącego katalogu roboczego.
fatal: destination path '.' already exists and is not an empty directory.
Istnieją dwa podejścia do tego. Jeśli to możliwe, zacznę od czystego folderu dla nowego katalogu roboczego git, a następnie skopiuję twoją wersję rzeczy później. Może to wyglądać jak *:
mv $dir $dir.orig
git clone $url $dir
rsync -av --delete --exclude '.git' $dir.orig/ $dir/
rm -rf $dir.orig
W tym momencie powinieneś mieć całkiem czystą kopię roboczą z poprzednim folderem roboczym jako bieżącym katalogiem roboczym, więc wszelkie zmiany obejmujące usunięcie plików pojawią się na radarze, jeśli uruchomisz git status.
Z drugiej strony, jeśli naprawdę musisz to zrobić na odwrót, możesz uzyskać ten sam wynik z czymś takim:
cd $dir
git clone --no-checkout $url tempdir
mv tempdir/.git .
rmdir tempdir
git reset --mixed HEAD
Tak czy inaczej, pierwszą rzeczą, którą chciałbym zrobić, to uruchomić coś takiego, git stashaby uzyskać kopię wszystkich lokalnych zmian odłożonych na bok, a następnie możesz je ponownie zastosować i przeanalizować, które z nich chcesz popełnić.
* Oba przykłady zakładają, że zaczynasz od powłoki w katalogu nadrzędnym swojego projektu.
To najlepsza ze wszystkich metod, jakie spotkałem
Sklonuj tylko folder .git repozytorium (wyłączając pliki, które już są w folderze existing-dir) do pustego katalogu tymczasowego
git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp // może chcieć --no-hardlinks do klonowania lokalnego repozytoriumPrzenieś folder .git do katalogu z plikami. To sprawia, że existing-dirrepozytorium git.
mv existing-dir/existing-dir.tmp/.git existing-dir/Usuń katalog tymczasowy
rmdir existing-dir/existing-dir.tmp
cd existing-dir
Git uważa, że wszystkie pliki zostały usunięte, co przywraca stan repozytorium do HEAD.
UWAGA: wszelkie lokalne zmiany w plikach zostaną utracone.
git reset --mixed HEADJeśli używasz co najmniej git 1.7.7 (który nauczył się clonetej --configopcji), aby zmienić bieżący katalog w kopię roboczą:
git clone example.com/my.git ./.git --mirror --config core.bare=false
Działa to przez:
.gitfolderze--mirrorsprawia, że nowy klon w folderze jako czysto metadanych .gitmusi być--config core.bare=falsecountermands niejawny bare=truez --mirroropcji, umożliwiając tym samym repozytorium mieć skojarzony katalog roboczy i działać jak normalny klonuTo oczywiście nie zadziała, jeśli .gitkatalog metadanych już istnieje w katalogu, który chcesz przekształcić w kopię roboczą.
[core]sekcją konfiguracji lokalnej obejmującą zarówno bare = true i bare = false . Bardziej problematyczne jest to, że będzie miał niepoprawne wartości dla originpilota, wraz z [remote "origin"]sekcją zawierającą mirror = truespecyfikację pobierania, która nie będzie działać poprawnie z kopią roboczą. Po rozwiązaniu tych problemów klonowanie normalnie i przenoszenie nowych kopii roboczych .gitbędzie bardziej wydajne.
Zwykle najpierw sklonuję pierwsze repozytorium, a następnie przeniosę wszystko z istniejącego folderu do początkowego repozytorium. Działa za każdym razem.
Zaletą tej metody jest to, że nie przegapisz niczego z początkowego repozytorium, w tym README lub .gitignore.
Możesz także użyć poniższego polecenia, aby zakończyć kroki:
$ git clone https://github.com/your_repo.git && mv existing_folder/* your_repo
Możesz to zrobić, wpisując rekurencyjnie następujące wiersze poleceń:
mkdir temp_dir // Create new temporary dicetory named temp_dir
git clone https://www...........git temp_dir // Clone your git repo inside it
mv temp_dir/* existing_dir // Move the recently cloned repo content from the temp_dir to your existing_dir
rm -rf temp_dir // Remove the created temporary directory