2010-03-09 27 views
417

Tôi có thư mục A với các tệp phù hợp với thư mục B. Thư mục A có thể có các tệp cần thiết khác. Thư mục B là một repo git.Làm cách nào để sao chép vào thư mục không trống?

Tôi muốn sao chép thư mục B vào thư mục A nhưng git-clone sẽ không cho phép tôi kể từ khi thư mục không trống.

Tôi đã hy vọng nó sẽ chỉ sao chép .git và vì tất cả các tệp phù hợp với tôi có thể đi từ đó?

Tôi không thể sao chép vào thư mục trống vì tôi có tệp trong thư mục A không nằm trong thư mục B và tôi muốn giữ chúng.

sao chép .git không phải là một lựa chọn vì tôi muốn refs để đẩy/kéo với và tôi không muốn thiết lập chúng bằng tay.

Có cách nào để thực hiện việc này không?

Cập nhật: Tôi nghĩ điều này có hiệu quả, có ai có thể thấy bất kỳ sự cố nào không? ->

cd a 
git clone --no-hardlinks --no-checkout ../b a.tmp 
mv a.tmp/.git . 
rm -rf a.tmp 
git unstage # apparently git thinks all the files are deleted if you don't do this 
+2

có lẽ bạn có thể thay đổi câu trả lời được chấp nhận? –

Trả lời

130

Trong vỏ sau lệnh existing-dir là một thư mục có nội dung phù hợp với các tập tin theo dõi trong repo-to-clone kho git.

# Clone just the repository's .git folder (excluding files as they are already in 
# `existing-dir`) into an empty temporary directory 
git clone --no-checkout repo-to-clone existing-dir/existing-dir.tmp # might want --no-hardlinks for cloning local repo 

# Move the .git folder to the directory with the files. 
# This makes `existing-dir` a git repo. 
mv existing-dir/existing-dir.tmp/.git existing-dir/ 

# Delete the temporary directory 
rmdir existing-dir/existing-dir.tmp 
cd existing-dir 

# git thinks all files are deleted, this reverts the state of the repo to HEAD. 
# WARNING: any local changes to the files will be lost. 
git reset --hard HEAD 
+0

@russel ah bạn, cảm ơn bạn –

+4

Tôi cần phải thực hiện 'git reset --hard HEAD' hoặc nó sẽ không bỏ qua các tệp" đã xóa ". – Dimitar

+14

'git reset HEAD' làm việc tốt cho tôi. 'git reset --hard HEAD' phá hủy bất kỳ thay đổi nào trong tệp của bạn, vì vậy nếu chúng không chính xác giống như các tệp trong kho lưu trữ, bạn không nên làm điều đó. – Tgr

3

Có lẽ tôi hiểu lầm câu hỏi của bạn, nhưng nó sẽ không thể đơn giản hơn nếu bạn sao chép/di chuyển các tập tin từ A đến git repo B và thêm những cái cần thiết với git add?

UPDATE: Từ git doc:

Nhân bản thành một thư mục hiện có chỉ được phép nếu thư mục rỗng.

NGUỒN: http://git-scm.com/docs/git-clone

+2

Không, chủ sở hữu và các tập tin có thể tùy ý. Điều này là dành cho một tình huống với nhiều nhà phát triển. Tất cả chúng ta đều có các thư mục hiện có và chỉ có một thư mục hiện đang kiểm tra git. Tất cả chúng ta đều có cùng một tập hợp con các tệp vì vậy chúng tôi muốn các nhà phát triển khác có thể sao chép trong khi giữ lại các tệp của họ. Và nó phải thanh lịch và tiện lợi nhất có thể. –

+0

Thành thật mà nói, tôi không thấy điểm phát triển trong điều kiện như vậy. Bạn không thể sử dụng các nhánh và hợp nhất các hoạt động? Hoặc có kho phụ với phụ thuộc bên ngoài? Tại sao bạn muốn dựa vào một "git checkout" đơn lẻ? –

+5

Một "git checkout" không phải là điểm của toàn bộ thử thách. Nó chỉ là đây là cách nó được và chúng tôi cần một cách để di chuyển về phía trước. Tôi đã cập nhật câu hỏi ban đầu với giải pháp dường như hoạt động. Tuy nhiên, tôi đánh giá cao phản hồi. –

3

tôi đang tìm kiếm một cái gì đó tương tự, và đây là những gì tôi đã đưa ra:

tình hình của tôi là một trong những nơi tôi có một cây web hoạt động và tôi đã cố gắng để tạo ra một kho lưu trữ từ xa cho nó không nhúc nhích bất kỳ tệp nào trong cây web hiện tại. Dưới đây là những gì tôi đã làm:

  1. Đến cây web và chạy git init
  2. Chuyển đến vị trí dự định của kho và chạy: git clone --bare /path/to/web/repo
  3. Chỉnh sửa file config trong repo từ xa của tôi và loại bỏ các phần [remote "origin"] .
  4. Thêm một phần [remote "origin"] để .git/config trong trỏ cây web để repo từ xa mới.
+0

Tôi thích công thức này rất nhiều. – dland

+0

'git clone --bare' ở đây là thừa và mạch. Tại sao không chỉ 'git remote add origin 'ở nơi đầu tiên? – Araxia

24

Đây là những gì tôi đã kết thúc khi tôi gặp vấn đề tương tự (ít nhất tôi nghĩ đó là vấn đề tương tự). Tôi đã đi vào thư mục A và chạy git init.

Vì tôi không muốn các tập tin trong thư mục A đến được theo sau bởi git, tôi sửa .gitignore và thêm vào các tập tin hiện có để nó. Sau đó tôi chạy git remote add origin '<url>' && git pull origin master et Voila, B được "nhân bản" vào A mà không một nấc cục duy nhất.

+0

làm việc hoàn hảo cho tôi, thx :) – nerdess

+6

Để rõ ràng, lệnh là 'git remote add origin (url) && git pull origin master' – Pre101

+0

Câu trả lời hay nhất cho tôi! –

539

này đã làm việc cho tôi:

git init 
git remote add origin PATH/TO/REPO 
git fetch 
git reset origin/master # this is required if files in the non-empty directory are in the repo 
git checkout -t origin/master 

LƯU Ý:-t sẽ thiết lập các chi nhánh thượng nguồn cho bạn, nếu đó là những gì bạn muốn, và nó thường là.

+19

Điều này có ý nghĩa nhất. –

+2

Tôi sử dụng phương pháp này, nó hoạt động tuyệt vời! Một lưu ý, tùy chọn -t nên là --track, mà không có trong tổng quan nhưng là chi tiết; git giúp thanh toán. http://git-scm.com/docs/git-checkout – AnneTheAgile

+64

Điều này không hoạt động trong thư mục không trống khi tệp đến đã tồn tại (như câu hỏi ban đầu mô tả). Nhưng nếu bạn 'git reset origin/master' sau' git fetch', nó sẽ hoạt động (cũng bảo toàn mọi thay đổi cục bộ). – Araxia

6

Một công thức đơn giản dường như làm việc tốt cho tôi:

git clone --bare $URL .git 
git config core.bare false 

trường hợp sử dụng chính của tôi để kiểm tra ra vào một thư mục với các tập tin hiện có là để kiểm soát Unix của tôi dotfiles với Git. Trên một tài khoản mới, thư mục chính sẽ có một số tệp trong đó, thậm chí cả những tệp tôi muốn nhận từ Git.

+1

Kho lưu trữ trần được thiết lập hơi khác một chút và trong khi thao tác này không hoạt động, tôi sẽ không khuyến nghị sử dụng. :) – ThorSummoner

+1

Bạn có thể cụ thể hơn không? Điều gì là khác nhau? –

+0

Chỉ có hai sự khác biệt: 1.) Tệp '.git/config' chỉ ra rằng các repos đang trống. 2.) Các tệp thông thường được lưu trữ trong '.git' được lưu trữ tại thư mục gốc (mà bạn đã gọi là' .git') – mozey

74

Một sửa đổi chút ít để một trong những câu trả lời mà làm việc cho tôi:

git init 
git remote add origin PATH/TO/REPO 
git pull origin master 

để bắt đầu làm việc trên các chi nhánh chủ ngay lập tức.

+7

Bạn cũng có thể sử dụng 'origin' thay vì' PATH/TO/REPO' ở dòng cuối cùng. –

+0

phải đặt lại HEAD - để dọn dẹp thư mục hiện có bị bẩn, mà không xóa các tệp không liên quan được chỉ định trong gitignore –

+0

Đây là một tệp thực sự làm việc cho tôi, trái ngược với câu trả lời của @ cmcginty. – certainlyakey

0

Tôi thích câu trả lời của Dale, và tôi cũng nói thêm

git clone --depth 2 --no-checkout repo-to-clone existing-dir/existing-dir.tmp 
git branch dev_new214 
git checkout dev_new214 
git add . 
git commit 
git checkout dev 
git merge dev_new214 

Độ sâu cạn tránh rất nhiều phụ dev đầu cam kết. Chi nhánh mới đã cho chúng tôi một lịch sử trực quan tốt rằng có một số mã mới từ máy chủ này được đặt vào. Đó là các nhánh sử dụng hoàn hảo theo ý kiến ​​của tôi. Cảm ơn tôi về sự hiểu biết sâu sắc của tất cả những người đã đăng ở đây.

8

này đã làm việc cho tôi:

cd existing_folder 
git init 
git remote add origin path_to_your_repo.git 
git add . 
git commit 
git push -u origin master 
3

đây là công việc đối với tôi, nhưng bạn nên ghép các tập tin lưu trữ từ xa đối với các tệp:

git init 
git remote add origin url-to-git 
git branch --set-upstream-to=origin/master master 
git fetch 
git status 
+0

Cảm ơn bạn đời. Cho lệnh làm việc hoàn hảo ... Cảm ơn –

8
git init 

git remote add origin PATH/TO/REPO 

git fetch 

git checkout -t origin/master -f 

Modified từ câu trả lời @ cmcginty của - không có -f nó không hoạt động cho tôi

0

Tôi đã sử dụng điều này một vài phút trước đây, đòi hỏi ít khả năng hủy lệnh ive:

cd existing-dir 
git clone --bare repo-to-clone .git 
git config --unset core.bare 
git reset 

Và voilá!

0

Đây là những gì tôi đang làm:

git clone repo /tmp/folder 
cp -rf /tmp/folder/.git /dest/folder/ 
cd /dest/folder 
git checkout -f master 
Các vấn đề liên quan