2010-02-12 46 views
5

Tôi có một kho lưu trữ mà tôi làm việc. Có một thư mục trong đó tôi đặt tất cả nội dung tôi muốn mở nguồn để tách biệt với các phần riêng tư. Có cách nào để tự động nhận được git để đẩy bất cứ điều gì cam kết vào thư mục đó đến một kho lưu trữ github mà không cần phải nhớ để đẩy các tập tin mới được thay đổi lên đó mỗi lần? Tôi muốn đẩy toàn bộ kho lưu trữ đến một vị trí github khác.Tự động đẩy các thay đổi vào một thư mục trong kho git để github?

Trả lời

8

Nếu bạn có một kho lưu trữ nơi các bộ phận được dự định là công khai và các bộ phận được dự định là riêng tư, thì bạn cần phải thay đổi một cách cơ bản một cái gì đó trong thiết lập kho lưu trữ của mình. git theo dõi các kho lưu trữ hoàn chỉnh, vì vậy bạn có thể tạo kho lưu trữ công khai hoặc riêng tư, nhưng không phải một phần điều này và một phần.

Nếu bạn có cả repo với các tệp "công khai" và repo có tệp "riêng tư", bạn có thể thêm móc git vào repo "công khai" để tự động đẩy commit và chỉ giữ riêng tư repo riêng .

Tuy nhiên, bạn đang viết rằng bạn có một repo đơn chứa cả "công cộng" và file "private", vì vậy bạn cần phải chia đó vào một cái gì đó "công cộng" và một cái gì đó "tin một cách nào đó.

Bạn có một số lựa chọn để giải quyết tình huống này:.

  1. chia ra thư mục "công cộng" vào kho lưu trữ riêng của mình mà bạn sẽ đẩy lên github này sẽ viết lại lịch sử của "công cộng" thư mục một chút. Tôi sẽ phác thảo chi tiết hơn bên dưới.

  2. Tạo chi nhánh chỉ liên quan đến thư mục "công khai", và chỉ xuất bản nhánh đó. Điều này rất nguy hiểm trong "vô tình đẩy, nghĩa là xuất bản, nội dung cá nhân", và không thể thực hiện được hoặc ít nhất là rất khó thực hiện nếu bạn có bất kỳ cam kết nào chạm vào cả tệp "công khai" và "riêng tư" tư vấn cho tùy chọn này và sẽ không viết thêm về tùy chọn này.

Đối với tách ra khỏi "công cộng" thư mục vào kho riêng của mình, tạo ra một "công cộng" mới nhánh chi nhánh của bạn "kết hợp", và sử dụng git filter-branch vào nó để làm mới "công cộng" chi nhánh chỉ chứa những thứ từ thư mục "công khai". Phần "Ví dụ" chỉ hiển thị ví dụ về bộ lọc --subdirectory phù hợp). Sau đó, bạn sẽ có cả nhánh "kết hợp" cũ của mình với cả thư mục "công khai" và các thư mục riêng tư trong đó và nhánh "công khai" mới chỉ với thư mục "công khai".

Lưu ý rằng ví dụ: thông báo cam kết trong chi nhánh "công khai" mới vẫn có thể chứa thông tin "riêng tư". Vì vậy, bạn nên xem xét tất cả thông báo cam kết, quét chúng để biết thông tin cá nhân và có thể làm rõ thông tin cá nhân đó, ví dụ: với git rebase -i.

Cập nhật: [Sự thúc đẩy tiếp theo của chỉ các "công cộng" chi nhánh và không có gì khác có thể sẽ không chuyển bất kỳ thông tin khác, do đó dọn dẹp repo này có lẽ không cần thiết.] Nếu bạn cần phải làm bất kỳ redactions, bạn sẽ muốn xóa vòng quay chưa được chỉnh sửa cũ khỏi repo bằng cách sử dụng git gc (có thể với các tùy chọn --prune=0--aggressive - nhưng tôi không thể tìm thấy câu trả lời SO có thêm thông tin về điều đó).

Bây giờ, chi nhánh "công khai" của bạn đã sẵn sàng để xuất bản. Để đảm bảo nó chỉ chứa thông tin "công khai", bạn có thể đẩy nó vào một kho trống rỗng cục bộ mới, kiểm tra nội dung của điều đó để xác minh tất cả các thông tin không có thông tin cá nhân. Sau khi bạn hài lòng, bạn có thể đẩy nhánh "public" vào repo trống mới trên github. Repo trên github sau đó sẽ CHỈ chứa nhánh "public", mà bạn nên đặt tên là "master" trên repo github.

Repo địa phương của bạn với chi nhánh "kết hợp" vẫn chứa cả thông tin công khai và riêng tư trực tiếp và không có kết nối với repo "công khai" mới nào.

Bây giờ bạn có thể ghi lại lịch sử của nhánh "kết hợp" để chỉ chứa các bit không công khai, nhưng sẽ hy sinh tất cả các kết nối giữa trạng thái "công khai" và "riêng tư" trong tất cả lịch sử xây dựng lại những thứ cũ sẽ trở thành gần như không thể. Vì vậy, tôi đề nghị để lại "kết hợp" của lịch sử chi nhánh một mình, và chỉ cần loại bỏ các "công cộng" thư mục từ nó trong một cam kết mới.

Nếu tích hợp giữa tệp riêng tư và tệp công khai của bạn rất chặt chẽ và phụ thuộc phiên bản, bạn có thể sử dụng git submodule để thêm phiên bản cụ thể của repo "công khai" từ github vào kho lưu trữ riêng tư của bạn. Một thư mục con mới được đặt tên giống như thư mục "công khai" cũ sẽ giảm thiểu những thay đổi đối với nội dung riêng tư của bạn, vì sau đó tất cả các tệp "công khai" sẽ nằm trong đường dẫn cũ của chúng. Lưu ý rằng thư mục submodule sẽ không tự động cập nhật khi một cái gì đó đã được đẩy vào github. Bạn có thể làm việc xung quanh điều đó bằng cách thêm một git hook vào thư mục con submodule cục bộ của bạn để cập nhật thông tin submodule trong repo "kết hợp".

Nếu sự tích hợp giữa tệp riêng tư và tệp công khai của bạn lỏng lẻo hơn, bạn cũng có thể xử lý các tệp công khai như bất kỳ dự án bên thứ ba nào bên ngoài và tích hợp nó vào nội dung riêng tư của bạn theo cách mọi người khác tích hợp nó. bất kỳ phần mềm bên ngoài nào mà phần mềm "riêng tư" của bạn phụ thuộc vào.

+0

Vâng, sự tích hợp chặt chẽ giữa công cộng và tư nhân công cụ là lý do tại sao tôi muốn giữ chúng trong một repo. Các công cụ công cộng chủ yếu được thay đổi khi tôi làm việc trên các công cụ riêng tư sử dụng nó, vì vậy tôi không muốn phải kéo. Ngoài ra, tôi muốn có thể gắn thẻ trạng thái của kho lưu trữ riêng tư và bao gồm phiên bản hiện tại của nội dung công khai. – uliwitness

+0

Mô-đun con Git ghi lại SHA của các cam kết của mô-đun con. Nếu bạn gắn thẻ repo riêng tư, thẻ đó sẽ bao gồm tất cả các SHA commit của submodules. Vì vậy, bạn có thể nhận được các khớp nối chặt chẽ mong muốn. – ndim

0

Sử dụng githook để thúc đẩy cam kết.

+0

Điều đó sẽ không đẩy toàn bộ kho lưu trữ? Làm thế nào tôi có thể trích xuất thư mục đó và nội dung của nó từ đó? – uliwitness

+0

submodule các thư mục, posthook đẩy – databyte

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