Jak zmusić Gita do sklonowania w bieżącym katalogu

499

Robię:

git clone ssh://[email protected]/home/user/private/repos/project_hub.git ./

Dostaję:

Fatal: ścieżka docelowa „.” już istnieje i nie jest pustym katalogiem.

Znam ścieżkę. już istnieje. I zapewniam, że katalog jest pusty. (Robię to w środku i nic nie widzę!)

Czego mi brakuje tutaj, aby sklonować ten projekt do bieżącego katalogu?

MEM
źródło
16
jeśli robisz ls -a, czy widzisz .gitkatalog?
Davin Tryon
2
@dtryon - Nie. Ale widzę DS_Store cokolwiek to jest. Może powinienem się tego pozbyć. Dzięki za to -a: s
MEM
@Dziękujemy za szybką odpowiedź. James Maclaughlin, który wydaje się pięknym poleceniem, aby upewnić się, że sklonujemy do pustego katalogu. :)
MEM,
1
Zakładam, że jesteś na komputerze Mac . Czy to pomaga: stackoverflow.com/questions/107701/…
Davin Tryon
Co do wartości, w każdym folderze, który przeglądasz na komputerze Mac, zostaną utworzone te małe pliki. Jest to bardzo denerwujące zarówno dla użytkowników systemu Windows, którzy korzystają z tych samych udziałów, oraz dla każdego systemu (np. Git), który wymaga, aby foldery były puste lub wykonuje czynności programowo na każdym pliku w folderze.
jsims281

Odpowiedzi:

509

po prostu umieść obok niego kropkę

git clone [email protected]:user/my-project.git .

Od git help clone:

Klonowanie do istniejącego katalogu jest dozwolone tylko wtedy, gdy katalog jest pusty.

Upewnij się więc, że katalog jest pusty (sprawdź za pomocą ls -a), w przeciwnym razie polecenie się nie powiedzie.

Roshan Pal
źródło
18
uzgodniono, należy pamiętać, że na komputerze Mac plik .DS_Store automatycznie utworzony przez wyszukiwarkę zablokuje klon. sprawdzić za pomocąls -la
ptim
281
Nie. To nie jest poprawna odpowiedź. To nadal zwróci „fatal: ścieżka docelowa”. już istnieje i nie jest pustym katalogiem. ”
Sid Sarasvati,
16
Działa dla mnie za pomocą git v1.8.3.2. @SidSarasvati Czy na pewno bieżący katalog jest pusty ?
Wesley Baugh
3
@SidSarasvati dobrze dla mnie directoy nie jest pusty, ale nie dbam o to, więc nie jestem pewien, dlaczego Git miałby to zrobić. Dlaczego git nie może klonować do niepustego katalogu? Z pewnością funkcjonalność to tylko podstawowe pobieranie.
Nathan Hornby
3
mkdirtworzy twarde linki do .i ..domyślnie, więc czy nowy katalog jest technicznie „pusty” w systemach uniksowych? To znaczy, myślę, mógłbyś unlink .i unlink ..ale to może spowodować ogromne problemy później, jeśli zapomni się ponownie połączyć ponownie po klonowaniu ....
SeldomNeedy
351

Poniższe elementy prawdopodobnie nie są w pełni równoważne klonowi we wszystkich przypadkach, ale załatwiły sprawę:

git init .
git remote add -t \* -f origin <repository-url>
git checkout master

W moim przypadku powoduje to utworzenie .git/configpliku równoważnego z plikiem, który otrzymuję podczas klonowania.

Andre Holzner
źródło
40
Co więcej, jest to inkantacja, która pozwala na pozostanie bieżącej zawartości - powiedzmy, jeśli klonujesz pliki dotfiles do katalogu domowego.
rbellamy
7
Dzięki temu w końcu mogę klonować do dowolnego folderu, który mi się podoba, bez traktowania Git jak dziecka. Gdy dodałem również tymczasowy plik .gitignore zawierający *(zignoruj ​​wszystko), mogłem wykonać, git checkout mastermimo że w folderze były już inne pliki. Następnie wszystkie zatwierdzone pliki z repozytorium zostały sklonowane (a tymczasowy plik .gitignore został zastąpiony odpowiednim plikiem .gitignore z repozytorium). Wszystko działało cudownie. Powinno tak się stać samo przez się, używając git clone -fczegoś.
PaulMag
1
jeśli masz pliki, które są inne / nowe / zmienione, które zostaną nadpisane (... pliki zostaną nadpisane przez kasę ... Przerwanie) użyj: git checkout master -f
visualex
3
Jest -t \*to niepotrzebne, ponieważ jest domyślne.
Palec
1
git remote set-head origin -amoże się przydać. Ustawia domyślną gałąź origin ( refs/remotes/origin/HEAD) tak, jak jest ustawiona w zdalnym repozytorium. git clonerobi to automatycznie, w przeciwieństwie do git remote add -f.
Palec
212

@Andrew odpowiedział na to wyraźnie tutaj . Ale tak proste, jak to działa, nawet jeśli katalog nie jest pusty:

git init .
git remote add origin <repository-url>
git pull origin master
ambes
źródło
Z przyjemnością potwierdzam, że <repository-url>może to być również lokalne repozytorium, ponieważgit remote add origin /path/to/existing/repo
Krubo
60

Aby mieć pewność, że można sklonować repozytorium, przejdź do dowolnego katalogu tymczasowego i sklonuj tam projekt:

git clone ssh://[email protected]/home/user/private/repos/project_hub.git

Spowoduje to sklonowanie twoich rzeczy do project_hubkatalogu.

Po zakończeniu klonowania możesz przenieść ten katalog gdziekolwiek chcesz:

mv project_hub /path/to/new/location

Jest to bezpieczne i nie wymaga żadnych magicznych rzeczy.

eckes
źródło
9
Spowoduje to utworzenie podkatalogu w istniejącym /path/to/new/locationkatalogu, co z pewnością nie jest celem pytania.
Pavel Šimerda
Następnie będziesz musiał ręcznie przenieść ukryte pliki lub użyć skomplikowanego polecenia ... i to nie odpowiada na pytanie.
Czarny
53
git clone your-repo tmp && mv tmp/.git . && rm -rf tmp && git reset --hard
return1.at
źródło
to jest
drobna poprawka
15

Hmm ... określenie ścieżki prądu absolutnego za pomocą $(pwd)działało dla mnie.

git clone https://github.com/me/myproject.git $(pwd)

wersja git: 2.21.0

Nick Grealy
źródło
13

Jeśli bieżący katalog jest pusty, to zadziała:

git clone <repository> foo; mv foo/* foo/.git* .; rmdir foo
GoZoner
źródło
1
w moim przypadku działało nawet z niektórymi plikami w „.” katalog
OSdave
2
Zauważ, że wszelkie pliki dotf w katalogach pod foo, np. foo / bar / .foobar nie zostaną przeniesione za pomocą tego polecenia. Zobacz odpowiedź od @phatblat
lea
10

Oprócz odpowiedzi @ StephaneDelcroix, przed użyciem:

git clone [email protected]/my-project.git .

upewnij się, że twój aktualny katalog jest pusty, używając

ls -a
Jakehao
źródło
W obliczu tego problemu dzisiaj. Okazało się, że ukryłem foldery .git i .gitignore w katalogu, do którego próbowałem sklonować repozytorium. Kiedy usunąłem te foldery, wszystko było w porządku.
Tamara,
Jakie byłoby polecenie opróżnienia aktualnego katalogu? Myślę, że byłoby to bardziej przydatne niż tylko sprawdzenie :)
pie6k 19.04.16
9

Rozwiązanie: W tym przypadku w rozwiązaniu wykorzystano dot:rm -rf .* && git clone ssh://[email protected]/home/user/private/repos/project_hub.git .

rm -rf .* && można pominąć, jeśli mamy absolutną pewność, że katalog jest pusty.

Podziękowania dla: @James McLaughlin w komentarzach poniżej.

MEM
źródło
10
To wygląda źle, ponieważ. * Zawiera katalog nadrzędny! ja: ~ / tmp / tmp / tmp $ ls -d .* . .. me: ~ / tmp / tmp / tmp $
stackunderflow
To nie pomaga, ponieważ mam zależności w katalogu, w którym muszę się wyewidencjonować.
b01
18
Nie jestem pewien, czy rozsądnie jest napisać rm -rf (w dowolnej formie) w odpowiedzi SO bez jakiegoś NAPRAWDĘ STAŁEGO ostrzeżenia. Jakiś niedoświadczony użytkownik może przyjść tutaj, szukając „zielonego znacznika wyboru” (zazwyczaj najlepsza odpowiedź), a następnie skopiować i wkleić to polecenie i pufa… w bieżącym katalogu zaczyna się jego ciężka praca. BTW: rm -rf ./.*jest „bezpieczniejszy”, jeśli po prostu usuwasz ukryte (kropkowe) pliki i katalogi w bieżącym katalogu (tak jak wcześniej powiedział mi @stackunderflow). Jest rm -rfto niebezpieczne polecenie dla niedoświadczonych użytkowników, więc bądź ostrożny! Tylko moje 2 centy.
Andrew
działa na 1.7.1 Jedyny folder w środku był .gitpóźniej git init(wiedziałem o tym)
vladkras,
Nie musisz -rfusuwać normalnych plików. Proszę rozważyć usunięcie tej odpowiedzi lub przynajmniej zaakceptowanie innej.
Navin
6

Poprawianie odpowiedzi @ GoZoner:

git clone <repository> foo; shopt -s dotglob nullglob; mv foo/* .; rmdir foo

Komenda shopt pochodzi z tej odpowiedzi SO i zmienia zachowanie komendy „mv” na Bash, aby uwzględnić pliki kropkowe, do których musisz dołączyć katalog .git i wszelkie inne ukryte pliki.

Należy również pamiętać, że gwarantuje to, że będzie działać tak, jak jest, jeśli bieżący katalog (.) Jest pusty, ale będzie działał, dopóki żaden plik w sklonowanym repozytorium nie będzie miał takiej samej nazwy jak pliki w bieżącym katalogu. Jeśli nie obchodzi Cię, co jest w bieżącym katalogu, możesz dodać opcję -f (force) do polecenia „mv”.

phatblat
źródło
6

Miałem tę samą potrzebę. W moim przypadku miałem standardowy folder internetowy, który jest tworzony przez instalację serwera WWW. Na potrzeby tej ilustracji powiedzmy, że tak

/server/webroot

a webroot zawiera inne standardowe pliki i foldery. Moje repozytorium zawiera tylko pliki specyficzne dla witryny (HTML, javascript, CFML itp.)

Musiałem tylko:

cd /server/webroot

git init

git pull [url to my repo.git]

Musisz być ostrożny, aby wykonać git init w folderze docelowym, ponieważ jeśli tego nie zrobisz, wydarzy się jedna z dwóch rzeczy:

  1. Git pull po prostu się nie powiedzie z komunikatem o braku pliku git, w moim przypadku:

fatal: Nie repozytorium git (ani żadnego z katalogów nadrzędnych): .git

  1. Jeśli gdzieś w ścieżce nadrzędnej do folderu znajduje się plik .git, wyciągnięte repozytorium zostanie utworzone w TYM nadrzędnym pliku zawierającym plik .git. To mi się przydarzyło i byłem tym zaskoczony ;-)

To NIE przeszkadzało żadnym „standardowym” plikom, które mam w folderze głównym, ale musiałem dodać je do pliku .gitignore, aby zapobiec przypadkowemu dodaniu ich do kolejnych zatwierdzeń.

To wydaje się łatwym sposobem na „klonowanie” do niepustego katalogu. Jeśli nie chcesz, aby pliki .git i .gitignore były tworzone przez ściągnięcie, po prostu usuń je po ściągnięciu.

igeocacher
źródło
5

Dalsze ulepszanie odpowiedzi @ phatblat :

git clone --no-checkout <repository> tmp \
  && mv tmp/.git . \
  && rmdir tmp \
  && git checkout master

jako jedna wkładka:

git clone --no-checkout <repository> tmp && mv tmp/.git . && rmdir tmp && git checkout master

166_MMX
źródło
2
shopt -s dotglob
git clone ssh://[email protected]/home/user/private/repos/project_hub.git tmp && mv tmp/* . && rm -rf tmp
John Josef
źródło
3
Podaj więcej informacji, aby wyjaśnić, dlaczego Twój kod rozwiązuje problem i co robi.
Martin
„git clone ... tmp” - tworzy folder / tmp w katalogu, w którym polecenie jest wykonywane, i klonuje repozytorium Git. Następnie „mv tmp / *.” - przenosi wszystkie pliki z folderu / tmp w folderze nadrzędnym (gdzie wykonano poprzednie polecenie) i na koniec „rm -rf tmp” - usuwa folder / tmp.
Marinski,
1

użyj. (kropka) na końcu polecenia, jak poniżej

URL klonowania git .

Upendra
źródło
To nie działa na Macu, powoduje błąd: fatal: destination path '.' already exists and is not an empty directory.
Pedro Luz
Dla mac :: Powinieneś w katalogu nadrzędnym, a następnie użyć nazwy folderu zamiast. (Kropka), jak poniżej git clone URL flodername Upewnij się, że twój folder jest pusty.
Upendra,
0

Oto, co znalazłem:

Widzę to:

fatal: destination path 'CouchPotatoServer' already exists and is not an empty directory.

Wśród moich poszukiwań natknąłem się na:

https://couchpota.to/forum/viewtopic.php?t=3943

Poszukaj wpisu Clintona. Hall ... Jeśli spróbujesz tego (tak jak ja), prawdopodobnie dostaniesz access deniedodpowiedź, była moja pierwsza wskazówka, więc błąd początkowy (dla mnie) faktycznie wymykał się złemu rootowi kwestia.

Rozwiązanie tego problemu w systemie Windows: uruchom cmdlub git elevated, a następnie uruchom:

git clone https://github.com/RuudBurger/CouchPotatoServer.git

To był mój problem i po prostu podniesienie działało dla mnie.

ynotjs
źródło
0

Rozwiązaniem Windowsjest sklonowanie repozytorium do innego folderu, a następnie skopiowanie i wklejenie do oryginalnej lokalizacji lub po prostu skopiowanie .gitniewidocznego folderu.

croppio.com
źródło
-1

Usuwanie za pomocą

rm -rf. *

może sprawić ci kłopoty lub więcej błędów.

Jeśli masz folder / path / to / i chcesz usunąć wszystko w środku, ale nie ten folder, po prostu uruchom:

rm -rf / ścieżka / do / folderu / *

Sid
źródło
-1

Naprawiłem ten sam błąd, usuwając ukryty folder .git w moim katalogu głównym, a następnie dodając kropkę do „repo klonowania git”. w moim folderze root / dist. Jest to w kontekście projektu pakietu internetowego vue-cli. Więc to, co wszyscy mówią, ma rację, zwykle oznacza to, że masz śledzenie git albo w folderze, w którym próbujesz sklonować, albo w folderze nadrzędnym, albo w folderze głównym danego folderu!

Akin Hwan
źródło
-1
git clone ssh://[email protected]/home/user/private/repos/project_hub.git $(pwd)
Katalina
źródło
Pamiętaj, że nadal spowoduje to ten sam błąd opublikowany w pytaniu („ fatal: ścieżka docelowa” rozwiązana / ścieżka / z / pwd ”już istnieje i nie jest pustym katalogiem. ), Jeśli robisz to w niepustym informator.
Gino Mempin
-2

warto utworzyć nowy plik mkdir filename, a następnie uruchomić polecenie git clone xxxxx, działa na moim komputerze

szalony-qi
źródło
-2

Wystarczy usunąć (lub przenieść) zawartość, w tym .gitkatalog danego katalogu.
Zautomatyzowane narzędzia, takie jak studio Android, Rebuildrozwiążą problem.

Więcej informacji:
Pokazany błąd jarresolverdotyczył
ścieżki repozytorium gittemp\jarresolver\

Właśnie usunąłem zawartość temp\jarresolver\katalogu, w tym ukryty .gitkatalog.

To wszystko, wszystko działało, nie wymaga klonowania.
Kiedy to zrobiłem Rebuild, samo klonowanie i kompilacja Androida Studio zakończyło się sukcesem.

Manohar Reddy Poreddy
źródło
-3

Widziałem to pytanie wiele razy - i chcę to tylko podkreślić git pull z twojego katalogu załatwi sprawę.

Chyba że coś mi brakuje - to działało dla mnie.

itamar
źródło
5
git pullnic nie zrobi, jeśli nie zdefiniowano repozytorium, co jest krytyczną częścią tego, co git clonerobi.
hackel