Làm cách nào để Git sao chép vào thư mục hiện tại


499

Tôi đang làm:

git clone ssh://user@host.com/home/user/private/repos/project_hub.git ./

Tôi nhận được:

Tử vong: con đường đích '.' đã tồn tại và không phải là một thư mục trống.

Tôi biết con đường. đã tồn tại. Và tôi có thể đảm bảo rằng thư mục IS trống. (Tôi làm ls bên trong và tôi không thấy gì cả!)

Tôi còn thiếu gì ở đây để sao chép dự án đó vào thư mục hiện tại?


16
nếu bạn làm một ls -abạn có thấy một .gitthư mục?
Davin Tryon

2
@dtryon - Không. Nhưng tôi thấy DS_Store dù đây là gì. Có lẽ tôi nên thoát khỏi nó. Cảm ơn vì điều đó -a: s
MEM

@Cảm ơn bốn câu trả lời nhanh của bạn. James Maclaughlin dường như là một mệnh lệnh đẹp để đảm bảo chúng tôi sao chép vào một thư mục trống. :)
MEM

1
Tôi giả sử sau đó bạn đang ở trên máy Mac . Điều này có giúp ích gì không: stackoverflow.com/questions/107701/
Mạnh

Đối với những gì nó có giá trị, bất kỳ thư mục bạn duyệt trên máy Mac sẽ có những tệp nhỏ này được tạo ở đó. Thật khó chịu cho cả người dùng Windows đang sử dụng cùng một chia sẻ và cho bất kỳ hệ thống nào (ví dụ như git) cần các thư mục trống hoặc thực hiện các hành động theo chương trình trên mỗi tệp trong một thư mục.
jsims281

Câu trả lời:


509

chỉ cần đặt một dấu chấm bên cạnh nó

git clone git@github.com:user/my-project.git .

Từ git help clone:

Nhân bản vào một thư mục hiện có chỉ được phép nếu thư mục trống.

Vì vậy, hãy chắc chắn rằng thư mục trống (kiểm tra với ls -a), nếu không lệnh sẽ thất bại.


18
đồng ý, lưu ý rằng trên máy mac, tệp tự động .DS_Store được tạo bởi công cụ tìm sẽ chặn bản sao. kiểm tra vớils -la
ptim

281
Không. Đây không phải là câu trả lời đúng. Điều này vẫn sẽ trả về "fatal: Destination path '.' đã tồn tại và không phải là một thư mục trống. "
Sid Sarasvati

16
Hoạt động với tôi bằng git v1.8.3.2. @SidSaravati Bạn có chắc thư mục hiện tại trống không?
Wesley Baugh

3
@SidSaravati tốt cho tôi, directoy không trống, nhưng tôi không quan tâm đến điều đó nên tôi không chắc tại sao Git lại như vậy. Tại sao không thể git sao chép vào một thư mục không trống? Chắc chắn chức năng nó chỉ là một tải về cơ bản.
Nathan Hornby

3
mkdirtạo các liên kết cứng đến ...theo mặc định vậy một thư mục mới về mặt kỹ thuật có "trống" trong các hệ thống dựa trên Unix không? Ý tôi là, tôi đoán bạn có thể unlink .unlink ..điều đó có thể gây ra cho bạn những vấn đề lớn sau này nếu bạn quên liên kết lại sau khi nhân bản ....
SeldomNeedy

351

Những điều sau đây có lẽ không hoàn toàn tương đương với một bản sao trong mọi trường hợp nhưng đã lừa tôi:

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

Trong trường hợp của tôi, điều này tạo ra một .git/configtệp tương đương với tệp tôi nhận được khi thực hiện sao chép.


40
Hơn nữa, đây là câu thần chú cho phép duy trì nội dung hiện tại - giả sử nếu bạn nhân bản các dotfiles của bạn vào thư mục chính của bạn.
rbellamy

7
Với điều này, cuối cùng tôi cũng được phép sao chép vào bất kỳ thư mục nào tôi thích mà không cần Git đối xử với tôi như một đứa bé. Khi tôi cũng thêm một .gitignore tạm thời có chứa *(bỏ qua mọi thứ) tôi có thể thực hiện git checkout masterngay cả khi đã có một số tệp khác trong thư mục. Sau đó, tất cả các tệp được cam kết từ kho lưu trữ đã được sao chép (và .gitignore tạm thời đã bị ghi đè bởi .gitignore thích hợp từ repo). Tất cả đều làm việc tuyệt vời. Nó nên xảy ra theo cách này bằng cách sử dụng git clone -fhoặc một cái gì đó.
PaulMag

1
nếu bạn có các tệp khác / mới / đã thay đổi sẽ được ghi lại (... các tệp sẽ bị ghi đè bằng thanh toán ... Hủy bỏ) sử dụng: git checkout master -f
visualex 13/1/2015

3
Điều -t \*này là không cần thiết vì nó là mặc định.
Palec

1
git remote set-head origin -acó thể có ích Nó đặt nhánh mặc định gốc ( refs/remotes/origin/HEAD) như được đặt trong kho lưu trữ từ xa. git clonelàm điều này tự động, không giống như git remote add -f.
Palec

212

@Andrew đã trả lời rõ ràng ở đây . Nhưng đơn giản như điều này cũng hoạt động ngay cả khi thư mục không trống:

git init .
git remote add origin <repository-url>
git pull origin master

Tôi rất vui khi được xác nhận <repository-url>cũng có thể là một repo địa phương nhưgit remote add origin /path/to/existing/repo
krubo

60

Để chắc chắn rằng bạn có thể sao chép repo, hãy vào bất kỳ thư mục tạm thời nào và sao chép dự án ở đó:

git clone ssh://user@host.com/home/user/private/repos/project_hub.git

Điều này sẽ sao chép công cụ của bạn vào một project_hubthư mục.

Khi nhân bản xong, bạn có thể di chuyển thư mục này bất cứ nơi nào bạn muốn:

mv project_hub /path/to/new/location

Điều này là an toàn và không yêu cầu bất kỳ công cụ ma thuật xung quanh.


9
Điều này sẽ tạo ra một thư mục con trong thư mục có sẵn /path/to/new/locationmà chắc chắn không phải là điểm của câu hỏi.
Pavel imerda

Sau đó, bạn sẽ phải tự di chuyển các tệp ẩn hoặc sử dụng lệnh phức tạp ... và nó không trả lời câu hỏi.
Đen



15

Hmm ... chỉ định đường dẫn hiện tại tuyệt đối sử dụng $(pwd)làm việc cho tôi.

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

phiên bản git: 2.21.0


13

Nếu thư mục hiện tại trống, thì nó sẽ hoạt động:

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

1
trong trường hợp của tôi, nó hoạt động ngay cả với một số tệp trong '.' thư mục
OSdave

2
Lưu ý rằng bất kỳ dotfiles nào trong các thư mục dưới foo, vd. foo / bar / .foobar sẽ không được di chuyển bằng lệnh này. Xem câu trả lời từ @phatblat
lea

10

Ngoài câu trả lời của @ StephaneDelcroix, trước khi sử dụng:

git clone git@github.com.user/my-project.git .

đảm bảo rằng thư mục hiện tại của bạn trống bằng cách sử dụng

ls -a

Đối mặt với vấn đề này ngày hôm nay. Hóa ra tôi đã ẩn các thư mục .git và .gitignore trong thư mục mà tôi đang cố sao chép kho lưu trữ. Khi tôi loại bỏ các thư mục này, mọi thứ đều ổn.
Tamara

Điều gì sẽ được lệnh để trống dir hiện tại? Tôi nghĩ rằng nó sẽ hữu ích hơn là chỉ kiểm tra nó :)
pie6k

9

Giải pháp: Trong trường hợp này, giải pháp đã sử dụng dot, vì vậy:rm -rf .* && git clone ssh://user@host.com/home/user/private/repos/project_hub.git .

rm -rf .* && có thể được bỏ qua nếu chúng tôi hoàn toàn chắc chắn rằng thư mục trống.

Tín dụng đi đến: @James McLaughlin trên các bình luận bên dưới.


10
Điều này có vẻ xấu, vì. * Bao gồm thư mục cha! tôi: ~ / tmp / tmp / tmp $ ls -d .* . .. me: ~ / tmp / tmp / tmp $
stackunderflow

Điều này không có ích, bởi vì tôi có các phụ thuộc trong thư mục mà tôi cần kiểm tra.
b01

18
Tôi không chắc chắn nên viết rm -rf (dưới bất kỳ hình thức nào) vào câu trả lời SO mà không có dấu hiệu cảnh báo THẬT SỰ THỰC SỰ. Một số người dùng thiếu kinh nghiệm có thể đến đây để tìm kiếm "dấu kiểm màu xanh lá cây" (thường là câu trả lời hay nhất) sau đó sao chép lệnh này và gặp sự cố ... có công việc khó khăn của anh ta trong thư mục hiện tại. BTW: rm -rf ./.*"an toàn hơn" nếu bạn chỉ xóa các tệp và thư mục (dấu chấm) bị ẩn trong thư mục hiện tại (giống như @stackunderflow đã nêu trước tôi). Nhưng rm -rflà một lệnh nguy hiểm cho người dùng thiếu kinh nghiệm vì vậy hãy cẩn thận với nó! Chỉ cần 2 xu của tôi.
Andrew

hoạt động trên 1.7.1 Thư mục duy nhất bên trong là .gitsau git init(tôi biết)
vladkras

Bạn không cần -rfphải xóa các tập tin bình thường. Vui lòng xem xét xóa câu trả lời này hoặc ít nhất là chấp nhận một câu trả lời khác.
Navin

6

Cải thiện câu trả lời của @ GoZoner:

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

Lệnh shopt được lấy từ câu trả lời SO này và thay đổi hành vi của lệnh 'mv' trên Bash để bao gồm các dotfiles, bạn sẽ cần bao gồm thư mục .git và bất kỳ tệp ẩn nào khác.

Cũng lưu ý rằng điều này chỉ được đảm bảo để hoạt động như bình thường nếu thư mục hiện tại (.) Trống, nhưng nó sẽ hoạt động miễn là không có tệp nào trong repo nhân bản có cùng tên với các tệp trong thư mục hiện tại. Nếu bạn không quan tâm những gì trong thư mục hiện tại, bạn có thể thêm tùy chọn -f (lực lượng) vào lệnh 'mv'.


6

Tôi có cùng nhu cầu này. Trong trường hợp của tôi, tôi đã có một thư mục web tiêu chuẩn được tạo bởi cài đặt máy chủ web. Đối với mục đích của minh họa này, hãy nói rằng đây là

/server/webroot

và webroot chứa các tệp và thư mục tiêu chuẩn khác. Repo của tôi chỉ có các tệp cụ thể của trang web (html, javascript, CFML, v.v.)

Tất cả tôi phải làm là:

cd /server/webroot

git init

git pull [url to my repo.git]

Bạn cần cẩn thận để thực hiện git init trong thư mục đích vì nếu bạn KHÔNG làm một trong hai điều sau:

  1. Việc kéo git đơn giản sẽ thất bại với một thông báo về việc không có tệp git, trong trường hợp của tôi:

fatal: Không phải là kho git (hoặc bất kỳ thư mục mẹ nào): .git

  1. Nếu có một nơi tập .git trong đường dẫn mẹ vào thư mục của bạn repo kéo của bạn sẽ được tạo trong RẰNG mẹ có chứa các tập tin .git. Điều này đã xảy ra với tôi và tôi đã rất ngạc nhiên bởi nó ;-)

Điều này KHÔNG làm phiền bất kỳ tệp "tiêu chuẩn" nào tôi có trong thư mục webroot của mình nhưng tôi cần phải thêm chúng vào tệp .gitignore để ngăn chặn việc thêm chúng vào các cam kết tiếp theo.

Đây có vẻ là một cách dễ dàng để "nhân bản" vào một thư mục không trống. Nếu bạn không muốn các tệp .git và .gitignore được tạo bởi pull, chỉ cần xóa chúng sau khi kéo.


5

Cải thiện hơn nữa về câu trả lời của @ phatblat :

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

như một lớp lót:

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
Cung cấp thêm thông tin để giải thích lý do tại sao mã của bạn khắc phục sự cố và nó làm gì.
Martin

"git clone ... tmp" - tạo thư mục / tmp trong thư mục nơi lệnh được thực thi và sao chép kho Git. Sau đó "mv tmp / *." - di chuyển tất cả các tệp từ thư mục / tmp trong thư mục mẹ (nơi lệnh trước đó đã được thực thi) và cuối cùng là "rm -rf tmp" - loại bỏ thư mục / tmp.
Marinski

1

sử dụng. (dấu chấm) ở cuối lệnh của bạn như dưới đây

URL nhân bản git .


Điều này không hoạt động trên mac, nó gây ra lỗi: fatal: destination path '.' already exists and is not an empty directory.
Pedro Luz

Đối với mac :: Bạn nên theo thư mục mẹ và sau đó sử dụng tên thư mục thay vì. (Chấm) như bên dưới git clone URL flodername Hãy chắc chắn rằng thư mục của bạn trống.
Upendra

0

Đây là những gì tôi tìm thấy:

Tôi thấy điều này:

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

Trong số các tìm kiếm của tôi, tôi tình cờ tìm thấy:

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

Tìm kiếm mục nhập của Clinton. Tất cả ... Nếu bạn thử điều này (như tôi đã làm), bạn có thể sẽ nhận được access deniedphản hồi, đó là manh mối đầu tiên của tôi, vì vậy, lỗi ban đầu (đối với tôi), đã thực sự trốn tránh gốc sai vấn đề.

Giải pháp cho vấn đề này trong windows: đảm bảo bạn chạy cmdhoặc git elevatedsau đó chạy:

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

Trên đây là vấn đề của tôi và chỉ đơn giản là nâng cao làm việc cho tôi.


0

Giải pháp cho Windowslà sao chép kho lưu trữ vào thư mục khác, sau đó sao chép và dán vào vị trí ban đầu hoặc chỉ sao chép .gitthư mục vô hình.


-1

Loại bỏ với

rm -rf. *

có thể khiến bạn gặp rắc rối hoặc một số lỗi khác.

Nếu bạn có thư mục / path / to / và muốn xóa mọi thứ bên trong, nhưng không phải thư mục đó, chỉ cần chạy:

rm -rf / path / đến / thư mục / *


-1

Vì vậy, tôi đã sửa lỗi tương tự bằng cách xóa thư mục .git ẩn trong thư mục gốc của mình và sau đó thêm một khoảng thời gian vào 'git clone repo.' trong thư mục gốc / dist của tôi. Đây là trong bối cảnh của một dự án webpack vue-cli. Vì vậy, những gì người khác đang nói là đúng, điều đó thường có nghĩa là bạn có theo dõi git trong thư mục bạn đang cố sao chép vào hoặc trong thư mục mẹ hoặc thư mục gốc của thư mục được đề cập!


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

Lưu ý rằng điều này vẫn sẽ dẫn đến lỗi tương tự được đăng trong câu hỏi (" gây tử vong: đường dẫn đích 'đã giải quyết / đường dẫn / của / pwd' đã tồn tại và không phải là một thư mục trống. ") Nếu bạn đang thực hiện việc này trong một mục không trống danh mục.
Gino Mempin


-2

Thật hữu ích khi tạo một tệp mới bằng cách mkdir filenamechạy lệnh của git clone xxxxxnó, nó hoạt động trong máy tính của tôi


-3

Tôi đã thấy câu hỏi này rất nhiều lần - và tôi chỉ muốn chỉ ra rằng git pulltừ trong thư mục của bạn sẽ thực hiện thủ thuật.

Trừ khi tôi thiếu một cái gì đó ở đây - điều đó làm việc cho tôi.


5
git pullsẽ không làm gì nếu bạn không có kho lưu trữ được xác định, đây là một phần quan trọng của những gì git clone.
hackel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.