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


499

Robię:

git clone ssh://user@host.com/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?


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 git@github.com: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.


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.


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

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://user@host.com/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.


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



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


13

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

git clone <repository> foo; mv foo/* foo/.git* .; rmdir foo

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 git@github.com.user/my-project.git .

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

ls -a

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://user@host.com/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.


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”.


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.


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


2
shopt -s dotglob
git clone ssh://user@host.com/home/user/private/repos/project_hub.git tmp && mv tmp/* . && rm -rf tmp

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 .


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.


0

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


-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 / *


-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!


-1
git clone ssh://user@host.com/home/user/private/repos/project_hub.git $(pwd)

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


-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.


-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.


5
git pullnic nie zrobi, jeśli nie zdefiniowano repozytorium, co jest krytyczną częścią tego, co git clonerobi.
hackel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.