2010-03-05 64 views
37

Tôi muốn thêm một thư mục bên ngoài vào một kho lưu trữ hiện có.git: Làm thế nào để bạn thêm một thư mục bên ngoài vào kho lưu trữ?

ngoài Dir: /home/some/thư mục

Working Dir: /htdocs/.git

Nếu tôi cố gắng lệnh sau từ/htdocs dir:

git add /home/some/directory

Tôi gặp lỗi: gây tử vong: '/ home/some/directory' nằm ngoài kho lưu trữ

+0

Bạn thực sự muốn gì? Đối với tôi, có vẻ như bạn muốn một cái gì đó trong kho lưu trữ của bạn, nhưng không phải trong kho lưu trữ của bạn. – jdizzle

+0

Bản thân thư mục bên ngoài có phải là kho lưu trữ mà bạn muốn hợp nhất nhật ký không? – saeedgnu

+1

xem http://stackoverflow.com/questions/6392862/git-stash-worktree-woes – basZero

Trả lời

-3

Thêm liên kết tượng trưng đến thứ e thư mục trong kho lưu trữ. Sau đó, thêm như vậy.

ln -s /home/some/directory/ 
git add directory 
+4

Nhưng điều này không thực sự theo dõi bất cứ điều gì trong thư mục đích. Nó chỉ theo dõi liên kết. –

+0

Vì vậy, làm cách nào để đệ quy theo dõi mọi thứ theo thư mục đích? –

+0

Nó chỉ theo dõi các liên kết như trả lời ở trên tiểu bang, nếu bất cứ ai khác nhân bản repo họ nhận được liên kết trỏ đến 'hư không' (hoặc thậm chí tệ hơn, 'một nơi nào đó'). – AoeAoe

41

Nếu tôi cần làm điều gì đó như vậy, tôi thường di chuyển tệp hoặc thư mục bên ngoài đó vào git repo và symlink của nó là vị trí ban đầu.

mv /home/some/directory /htdocs/directory 
ln -s /htdocs/directory /home/some/ 
git add ./directory 

Tôi sử dụng kỹ thuật này khi tôi đang phát triển plugin cho ứng dụng mà tôi muốn giữ trong điều khiển phiên bản nhưng phải lưu trữ ở một vị trí cụ thể.

+2

workaround tốt đẹp :) – AoeAoe

+1

Điều này không làm việc ở tất cả cho tôi trong Mac OS X 10.10.3. Về cơ bản Wordpress không nhận ra các thư mục hoặc tập tin plugin của symlinked và chúng không xuất hiện trong danh sách plugin WP. Tui bỏ lỡ điều gì vậy? –

7

Có một giải pháp thực sự đơn giản cho việc này.

Giả sử bạn là Git-repo nằm trong/var/data/my-app và bạn muốn thêm/var/data/public/vào repo đó. Bạn không thể sử dụng 'add' vì Git sẽ không thêm tài nguyên bên ngoài thư mục gốc của repo. Vì vậy ..

Giải pháp:

  1. Move thư mục/var/dữ liệu/công cộng/thư mục vào thư mục gốc Git-repo của bạn (/ var/data/my-app).

  2. Tạo một sym-link (liên kết tượng trưng) bên trong/var/dữ liệu/công vào/var/data/my-app/thư mục công cộng, sử dụng: ln -s source_file_or_directory virtual_file_or_directory

Sau đó, chỉ cần thêm tệp hoặc thư mục được chuyển tới Git bằng cách sử dụng git add theo cách thông thường. Kiểm soát nguồn Git của bạn hiện đang theo dõi tệp/thư mục mong muốn và liên kết sym của bạn trong thư mục bên ngoài đảm bảo rằng tệp/thư mục có thể truy cập được vào bất kỳ thứ gì khác!

+1

điều này không thực sự theo dõi bất cứ điều gì trong thư mục đích. Nó chỉ theo dõi liên kết. Đúng? – incandescentman

+0

@PeterSalazar no, vì Stormbytes đề xuất di chuyển thư mục đích vào repo git. Liên kết tượng trưng duy trì vị trí ban đầu. Nếu bạn đã thêm liên kết vào repo, bạn sẽ chính xác. – shiri

+0

Điều này sẽ không hoạt động tốt nếu có nhiều người dùng sử dụng cùng một máy đóng góp cho cùng một dự án git. Ví dụ: Giả sử có hai Người dùng trong cùng một máy: U và T. U liên kết tượng trưng cho thư mục _/var/linked_ đến một nơi nào đó bên trong thư mục chính của nó. Một Người dùng khác muốn chỉnh sửa một số tệp trong thư mục _/var/linked_, nhưng anh ta phải có quyền đối với nó. Ngay cả khi T có quyền ghi vào thư mục được liên kết của U, T sẽ chỉnh sửa bản sao làm việc từ kho lưu trữ của U. – gagallo7

12
git --work-tree=/ add /home/some/directory 
+8

Bất kỳ giải thích nào về lý do tại sao tính năng này hoạt động? – Nightfirecat

+3

Điều này giải thích một chút: http://stackoverflow.com/questions/5283262/what-is-git-work-tree-why-have-i-never-needed-to-set-this-env-var-why -now mặc dù nó không rõ ràng với tôi những gì ai đó sẽ nhận được nếu họ nhân bản repo đó –

+0

Nó cũng làm cho văn bản .gitignore rất phức tạp và git trạng thái và git add --a sẽ loại bỏ các tập tin bên ngoài thư mục làm việc git. Bạn có thể thiết lập thư mục làm việc như một thiết lập kho lưu trữ cục bộ, nhưng theo mặc định, nó sẽ theo dõi mọi thứ trong thư mục được thiết lập. Mà một lần nữa, sẽ yêu cầu sự giúp đỡ của gitignore. Rắc rối hơn nó có giá trị. –

13

Tôi đã gặp lỗi tương tự ... Googled nó cho đến chết ... không nhiều xuất hiện.

câu trả lời của Christian làm việc:

git --work-tree=/ add /home/some/directory 

Nhưng sau đó "làm việc cây" cuốn hút tôi. Tôi grep'd tất cả tài liệu Git và đã đưa ra core.worktree.

tôi đã sử dụng

git config --global core.worktree/

Và thì đấy! Bây giờ tôi có thể thêm từ bất kỳ thư mục nào trong hệ thống. Tôi không biết liệu nó có gây ra vấn đề gì cho những nơi khác không, nhưng tôi sẽ cố gắng cập nhật khi tôi đi cùng.

+1

ý của bạn là viết "Bây giờ tôi có thể thêm từ * bất kỳ thư mục * nào trong hệ thống."? Chỉ cần tò mò, các biên tập viên bản sao trong tôi muốn chỉnh sửa câu trả lời của bạn oh rất nặng. : P –

+1

Đúng vậy, đó là trường hợp chứng khó đọc nhẹ cho bạn ... bộ não của bạn đã hoàn thành đoạn văn và làm điều gì đó khác trong khi ngón tay vẫn còn ở giữa nó. (Xin lỗi vì trả lời trễ) – MotherDawg

+0

Vì vậy, tôi không thể làm 'git add *': P – Nishant

0

Hoặc bạn có thể sử dụng mô-đun con nếu bạn muốn làm việc trên các repo git khác nhau (ln không hoạt động theo cách này). Hãy thử 'man git-submodule'.

1

Nếu mã bạn muốn thêm vào repo không quá lớn, bạn cũng có thể tự động sao chép mã đó vào repo của mình mỗi lần trước khi bạn đẩy.

Trong trường hợp của tôi, tôi ví dụ cần một file R, mà tôi thay đổi khá thường xuyên, trong một số hợp đồng mua lại và tôi đã viết một kịch bản shell nhỏ:

#!/usr/bin/env bash 

cp -r /some/directory/file.R . 
git add . 
git commit -m "add" 
git push 

... và tôi chạy kịch bản này để đẩy tất cả các thay đổi, bao gồm cả những thay đổi trong/some/directory.

Các vấn đề liên quan