GitHub: Làm thế nào để tạo một nhánh của kho lưu trữ công cộng riêng tư?


247

Làm thế nào tôi có thể rẽ nhánh một kho lưu trữ công cộng, nhưng làm cho ngã ba của tôi ở chế độ riêng tư? Tôi có đăng ký để hỗ trợ các kho riêng.

Câu trả lời:


394

Câu trả lời là đúng nhưng không đề cập đến cách đồng bộ mã giữa repo công khai và ngã ba.

Dưới đây là quy trình làm việc đầy đủ (chúng tôi đã thực hiện việc này trước khi tìm nguồn mở React Native ):


Đầu tiên, sao chép repo như những người khác đã nói (chi tiết ở đây ):

Tạo một repo mới (hãy gọi nó private-repo) thông qua giao diện người dùng Github . Sau đó:

git clone --bare https://github.com/exampleuser/public-repo.git
cd public-repo.git
git push --mirror https://github.com/yourname/private-repo.git
cd ..
rm -rf public-repo.git

Sao chép repo riêng để bạn có thể làm việc với nó:

git clone https://github.com/yourname/private-repo.git
cd private-repo
make some changes
git commit
git push origin master

Để thu hút sự nóng bỏng mới từ repo công cộng:

cd private-repo
git remote add public https://github.com/exampleuser/public-repo.git
git pull public master # Creates a merge commit
git push origin master

Tuyệt vời, repo riêng của bạn hiện có mã mới nhất từ ​​repo công cộng cộng với các thay đổi của bạn.


Cuối cùng, để tạo một yêu cầu kéo repo riêng -> repo công khai:

Sử dụng Giao diện người dùng GitHub để tạo một ngã ba của repo công khai (nút "Fork" nhỏ ở phía trên bên phải của trang repo công khai). Sau đó:

git clone https://github.com/yourname/the-fork.git
cd the-fork
git remote add private_repo_yourname https://github.com/yourname/private-repo.git
git checkout -b pull_request_yourname
git pull private_repo_yourname master
git push origin pull_request_yourname

Bây giờ bạn có thể tạo yêu cầu kéo qua Giao diện người dùng Github cho repo công khai, như được mô tả ở đây .

Khi chủ dự án xem xét yêu cầu kéo của bạn, họ có thể hợp nhất nó.

Tất nhiên toàn bộ quá trình có thể được lặp lại (chỉ cần bỏ qua các bước mà bạn thêm điều khiển từ xa).


2
Tại sao người ta không thể thêm repo riêng trống như một điều khiển từ xa mới vào một bản sao bình thường của repo công cộng và sau đó đẩy sang điều khiển từ xa? Điều gì sẽ là sự khác biệt?
Falko Menge

@FalkoMenge Tôi có cùng một câu hỏi. Đọc git-scm.com/docs/git-clone , có vẻ như một người bình thường git clonesẽ thiết lập các nhánh theo dõi từ xa và có thể một số cấu hình khác trong repo nhân bản mà bạn không thực sự muốn. Trong khi đó, một bản sao --bare chỉ sao chép thư mục .git từ xa.
bennlich

1
Điều đó cũng sẽ đẩy lịch sử cam kết tư nhân đến chi nhánh công cộng?
Sukhjinder Singh

1
@Sukhjinder Singh Có, bước cuối cùng sẽ đẩy lịch sử cam kết riêng đến repo công khai. Nếu bạn không muốn điều đó, bạn có thể xóa các cam kết của mình khi hợp nhất chúng với repo công khai và đẩy một cam kết duy nhất với tất cả các thay đổi của bạn. Xem ví dụ: stackoverflow.com/questions/5308816/how-to-use-git-merge-squash
Martin Konicek

1
Tôi đã bước đến nơi tôi nhân bản repo riêng của mình và sau đó thực hiện một thay đổi sau đó đẩy. Mọi thay đổi tôi đã thực hiện không được chú ý bởi git. git statuscho thấy mọi thứ cập nhật, cây làm việc sạch sẽ cho dù tôi có thay đổi gì đi nữa. Do đó, tôi không thể cam kết và thúc đẩy bất cứ điều gì. Tôi đã xóa repo riêng mới tôi đã thực hiện thêm 2 lần nữa để thử điều này nhưng vẫn tiếp tục gặp vấn đề tương tự. Bất kỳ đề xuất?
Sẽ

92

Có thêm một lựa chọn nữa (tháng 1-2015)

  1. Tạo một repo riêng mới
  2. Trên màn hình repo trống có nút / tùy chọn "nhập" nhập mô tả hình ảnh ở đây
  3. nhấp vào nó và đặt url repo github hiện có Không có tùy chọn github nào đề cập nhưng nó cũng hoạt động với repos github. nhập mô tả hình ảnh ở đây
  4. LÀM XONG

19
Điều này hoạt động, mặc dù một chút khác nhau. (Tôi đã thử vào tháng 8 năm 2015). Tôi đã không tìm thấy tùy chọn / nút nhập, vì vậy đã tìm ra nó và kết thúc bằng URL này. import.github.com/new Tại đây, bạn có thể nhập url github hiện có và nhấp vào nút Kiểm tra . Sau khi xác minh, bạn có thể nhập tên của repo mới của mình và nhấp vào nút Riêng tư và sau đó nhấp vào Bắt đầu nhập
Shiva

2
Tôi tin rằng @MattvanAndel có nghĩa là nhận xét đó là chính xác, không phải là câu trả lời ban đầu. Tôi cũng theo dõi bình luận của Shiva và nó đã hoạt động. Lưu ý rằng bạn KHÔNG nên tạo kho lưu trữ riêng cục bộ trước!
David H

Nếu tôi tạo một "ngã ba" riêng theo cách này và muốn biến nó thành một ngã ba công khai một lần nữa, tôi có thể làm điều đó không?
Anders Lindén

2
@Shiva Tôi sẽ phản hồi nếu bạn đưa ra câu trả lời từ nhận xét của mình.
bebbi

36

Các câu trả lời hiện tại hơi lỗi thời vì vậy, cho rõ ràng:

Câu trả lời ngắn gọn là:

  1. Làm một bản sao trần của repo công cộng.
  2. Tạo một cái riêng tư mới.
  3. Làm một tấm gương đẩy đến cái riêng tư mới.

Điều này được ghi lại trên GitHub: trùng lặp-a-repository


4
Có cách nào để kéo những thay đổi ngược dòng? Điều này rất quan trọng đối với một repo có giấy phép tự do - Tôi đã đặt repo của mình ở chế độ riêng tư nhưng vẫn muốn hợp nhất các thay đổi ngược dòng.
amarprabhu

2
Đúng. Bạn sẽ có thể thêm repo khác dưới dạng từ xa (theo dõi) mới (ví dụ: 'other-repo') và sau đó định kỳ tìm nạp và hợp nhất các thay đổi từ nó (ví dụ: 'git merge other-repo / ổn định').
stefano

26

Bạn phải nhân đôi repo

Bạn có thể xem tài liệu này (từ github)

Để tạo một bản sao của kho lưu trữ mà không cần chuyển, bạn cần chạy một lệnh nhân bản đặc biệt đối với kho lưu trữ ban đầu và đẩy gương sang kho mới.

Trong các trường hợp sau, kho lưu trữ mà bạn đang cố gắng chuyển sang - như exampleuser / new-repository hoặc exampleuser / mirrored - đã tồn tại trên GitHub. Xem "Tạo kho lưu trữ mới" để biết thêm thông tin.

Phản chiếu một kho lưu trữ

Để tạo một bản sao chính xác, bạn cần thực hiện cả hai bản sao trần và đẩy gương.

Mở dòng lệnh và gõ các lệnh sau:

$ git clone --bare https://github.com/exampleuser/old-repository.git
# Make a bare clone of the repository

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git
# Mirror-push to the new repository

$ cd ..
$ rm -rf old-repository.git
# Remove our temporary local repository

Nếu bạn muốn nhân bản một kho lưu trữ ở một vị trí khác, bao gồm nhận các bản cập nhật từ bản gốc, bạn có thể sao chép một bản sao và định kỳ đẩy các thay đổi.

$ git clone --mirror https://github.com/exampleuser/repository-to-mirror.git
# Make a bare mirrored clone of the repository

$ cd repository-to-mirror.git
$ git remote set-url --push origin https://github.com/exampleuser/mirrored
# Set the push location to your mirror

Như với một bản sao trần, một bản sao được nhân đôi bao gồm tất cả các nhánh và thẻ từ xa, nhưng tất cả các tham chiếu cục bộ sẽ được ghi đè mỗi khi bạn tìm nạp, vì vậy nó sẽ luôn giống như kho lưu trữ ban đầu. Đặt URL cho các lần đẩy đơn giản hóa việc đẩy vào gương của bạn. Để cập nhật máy nhân bản của bạn, hãy tìm nạp các bản cập nhật và đẩy, có thể được tự động hóa bằng cách chạy một công việc định kỳ.

$ git fetch -p origin
$ git push --mirror

https://help.github.com/articles/d repeatating-a-reposeective


Điều này tạo ra một bản sao của repo nhưng nó không tạo ra một ngã ba theo nghĩa GitHub. Khi bạn tạo một ngã ba thực tế trong GitHub, nó sẽ hiển thị một văn bản "rẽ nhánh từ exampleuser / repository-to-mirror" dưới tên ngã ba. Nó cũng hiển thị một cây của tất cả các nhánh khác khi bạn điều hướng đến github.com/exampleuser/new-reposeective/network/members.
apaatsio

20

GitHub hiện có tùy chọn nhập cho phép bạn chọn bất cứ thứ gì bạn muốn kho lưu trữ nhập mới của mình ở chế độ công khai hoặc riêng tư

Nhập kho lưu trữ Github


Nhập vẫn đang chạy trên một kho lưu trữ lớn (5 ngày), kiểm tra chúng nhanh hơn nhiều nhưng có lẽ đó là nhiều bước hơn để giữ cho nó cập nhật. Sự chậm chạp là điều dễ hiểu, tôi cho rằng vì nó nhập khẩu mọi thứ không chỉ là chi nhánh chính, nhưng tôi ước nó nhanh hơn ...
Liam Mitchell

1
Tôi sẽ thêm câu trả lời tương tự nhưng cảm ơn vì đã làm nó trước. Vui mừng khi Github miễn phí repos tư nhân có sẵn từ tháng 1 năm ngoái. : D
OBL
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.