Làm cách nào để tạo một repo GitHub mới từ một chi nhánh trong một repo hiện có?


170

Tôi có chi nhánh chủdự án mới . Và bây giờ tôi muốn tạo một repo hoàn toàn mới với chủ của nó dựa trên nhánh dự án mới.

Bối cảnh: Tôi có một kho chứa ba ứng dụng độc lập. Nó đã không bắt đầu theo cách này. Ban đầu chỉ có một ứng dụng trong repo. Tuy nhiên, theo thời gian, nhu cầu kinh doanh đã thay đổi. Một ứng dụng đã trở thành hai (một phiên bản cũ và viết lại.) Một dịch vụ web đã được thêm vào. Các chi nhánh riêng biệt được sử dụng để chứa ba dự án. Tuy nhiên, họ không chia sẻ bất kỳ mã nào. Và do đó, sẽ đơn giản hơn khi tách chúng thành các repos của riêng chúng.

Câu trả lời:


294

Tôi bắt đầu với ý tưởng của @ user292677 và tinh chỉnh nó để giải quyết vấn đề của mình:

  1. Tạo repo mới trong github.
  2. cd vào bản sao cục bộ của repo cũ mà bạn muốn trích xuất, được thiết lập để theo dõi nhánh dự án mới sẽ trở thành chủ nhân của repo mới .
  3. $ git push https://github.com/accountname/new-repo.git +new-project:master

Repo Github mới đã hoàn thành. Kết quả là;

  • kho lưu trữ Github mới có tên new-repo ,
  • mastertương ứng với dự án mới của repo cũ , với
  • Tất cả lịch sử được bảo tồn.

Trên thực tế, tôi thấy rằng bằng cách sử dụng phương pháp này, tôi có thể tạo repo mới với lựa chọn các nhánh được chọn bằng tay, được đổi tên theo ý muốn:

$ git push git@github.com:accountname/new_repo +new-project:master +site3a:rails3

Kết quả là chi nhánh site3a đã tồn tại trước đó cũng được chuyển sang repo mới và sẽ xuất hiện dưới dạng rails3 . Điều này hoạt động thực sự tốt: sơ đồ mạng cho thấy chủrails3 mới với lịch sử đầy đủ và trong mối quan hệ chính xác của chúng với nhau.

Cập nhật 2013-12-07: Được sử dụng với dự án khác và xác minh rằng công thức này vẫn hoạt động.

Cập nhật 2018-01-11: Cập nhật bước 3. để sử dụng đề xuất GitHub cho giao thức https. Công thức vẫn hoạt động.


Xin chào @Dogweather, cảm ơn vì đã chia sẻ điều này. bạn có thể khám phá sự khác biệt giữa phương thức của bạn và thay đổi url từ xa gốc, đẩy sang phương thức repo mới không?
Vincent

5
Dogweather, tôi đã sử dụng giải pháp của bạn nhiều hơn tôi có thể nhớ. Cảm ơn! Tôi đã phải kiểm tra old_branch trước khi nó hoạt động với tôi
Bjorn Theart

3
lưu ý rằng điều này sẽ không sao chép thẻ. Tôi tin rằng bạn có thể cần --follow-tagscho điều đó.
Nhân tố huyền bí

1
Lưu ý rằng bạn không cần tạo repo trên Github, bạn chỉ có thể pushđến một địa phương ( git initthay vì Github> Mới> ...)
OJFord

1
Tôi không muốn chuyển tất cả lịch sử cam kết của mình sang repo mới, tôi chỉ muốn sao chép các xác nhận thuộc về kho lưu trữ con. Điều này có thể không ??
Arbaz Rizvi

26

Cập nhật:

cd vào repo cục bộ chứa old_branch và:

$ git push https://github.com/accountname/new_repo.git +old_branch:master

9
git clone -b new-project /path/to/repo /new/repo/path

Chỉnh sửa: Trong GitHub, bạn có thể nâng cấp ngã ba repo, sau đó chuyển đến tab Quản trị viên trong bản sao của mình. Bên dưới có tên Kho lưu trữ tên và hình ảnh trực quan, có thể nhìn thấy rõ ràng là nhánh mặc định của nhánh này với một menu thả xuống của các nhánh. Chọn new-project.

Chỉnh sửa lại: Tôi mới nhận ra đó là masternhánh bạn muốn đặt, không chỉ là nhánh mặc định của Wikipedia. Vì thế…

  • Trên GitHub, tạo bản sao them/repođể you/repo.
  • Chạy git clone git@github.com:you/repo.git
  • Bắt đầu gitk.
  • [Bạn có thể muốn tạo một old-masterchi nhánh để không bị mất dấu vết của các cam kết cũ.]
  • Tìm cam kết gần đây nhất trên new-projectnhánh, nhấp chuột phải vào thông báo cam kết và chọn nhánh Đặt lại nhánh chính ở đây. (Bạn cũng có thể thực hiện việc này tại dòng lệnh bằng cách sử dụng git-reset, nhưng tôi chưa tìm ra cách gọi đúng.)

Lần đẩy tiếp theo của bạn lên repo GitHub của bạn sẽ cần phải được thực hiện với --forcetùy chọn, nhưng nếu không thì bạn đã hoàn thành.

Nếu đó là một trong những repos của riêng bạn thì bạn đang làm điều này với

  • Chạy git clone git@github.com:you/orig.git
  • Chạy git clone orig copy
  • Như tôi đã mô tả ở trên, nhưng từ bên trong copyrepo cục bộ , hãy đặt lại masternhánh đến nơi bạn muốn.
  • Tạo dự án GitHub trống you/copy. Thực hiện theo các hướng dẫn trên GitHub để thiết lập dự án đó làm điều khiển từ xa cho phiên bản địa phương của bạn copy, đẩy mastervà bạn đã hoàn tất!

Hừm! Tôi không chắc chắn cách thực hiện bước đầu tiên: nhân bản một repo trong github. Tôi không nghĩ rằng nó có thể.
Dogweather

@Dogweather, nó được gọi là từ bỏ giới thiệu trên GitHub; Tôi đã chỉnh sửa câu trả lời của tôi cho rõ ràng.
JC Salomon

Tôi đã không thể fork một repo trong một tài khoản. Bạn đã thử điều này cho mình?
Dogweather

5
  1. Tạo NEW_REPOSITORY trong github.
  2. cd OLD_REPOSITORY
  3. git đẩy https://github.com/accountname/NEW_REPO + chính: chủ

Và đó là tất cả. (Lưu ý: lịch sử git được bảo tồn)

Tôi đã thử câu trả lời ở trên và thấy nó không đủ cụ thể vì nó không chỉ định + master: master là thứ tôi cần để làm cho nó hoạt động. Nó hoạt động rất tốt.

Nguồn (với các sửa đổi của tôi để tránh các vấn đề về ssh với github): Mauricio Aiello, cựu Nhà phát triển Java, https://www.quora.com/How-do-I-create-a-new-GitHub-reposeective-from-a -branch-in-an-tồn tại


Điều đó thực sự hữu dụng hơn câu trả lời được chấp nhận. Nó hoạt động ngay cả trong các tình huống mà Git phàn nàn về lỗi src refspec khi không thể đẩy cũ sang kho lưu trữ mới.
Thông tin

2

Không chắc đây có phải là một cách tốt hay không, nhưng dù sao thì nó cũng dễ dàng:

git clone -b new-project git@github.com:User/YourProject.git newProjcet

Sau đó tạo một repo mới trên github và đẩy nó.


2

Hãy nhớ rằng khi bạn chỉ cần tạo một repo mới, bạn sẽ mất tham chiếu đến cái cũ và làm cho việc duy trì bất kỳ bản cập nhật nào cho dự án ban đầu được đồng bộ hóa với cái mới. Có lẽ không tốt hơn để ngã ba repo?


0

Ít bổ sung cho câu trả lời đúng:

$ git đẩy git@github.com: tên tài khoản / new_Vpo + old_branch: master

"git@github.com: accountname / new_Vpo" => lấy từ menu github "Clone hoặc download"

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.