cách tạo một kho git mới từ kho hiện có


77

Tôi có một kho lưu trữ git từ xa thực sự thay thế mọi thứ chúng tôi có trong một SCM cũ hơn khác. Nhiều dự án và sản phẩm đã được thêm vào kho trong những năm qua.

Có một nhánh trong kho này, tương ứng với một sản phẩm mà tôi quan tâm. Tôi chỉ muốn tạo một kho lưu trữ git hoàn toàn mới từ nhánh này, không thực sự lo lắng về việc mất lịch sử.

Git từ xa có thêm giải pháp không? Tôi muốn cho cả hai kho này ở trên cùng một máy chủ.

Suy nghĩ?

Câu trả lời:


80

Để tạo một kho lưu trữ Git mới từ một kho lưu trữ hiện có, người ta thường tạo một kho lưu trữ trống mới và đẩy một hoặc nhiều nhánh từ kho hiện có sang kho mới.

Các bước sau minh họa điều này:

  1. Tạo một kho lưu trữ mới. Nó phải để trần để bạn có thể đẩy tới nó.

    $ mkdir /path/to/new_repo
    $ cd /path/to/new_repo
    $ git --bare init

    Lưu ý : đảm bảo rằng kho lưu trữ mới của bạn có thể truy cập được từ kho lưu trữ hiện có. Có rất nhiều cách để làm điều này; giả sử rằng bạn đã làm cho nó có thể truy cập được qua ssh://my_host/new_repo.

  2. Đẩy một nhánh từ kho lưu trữ hiện có của bạn. Ví dụ, giả sử chúng ta muốn đẩy chi nhánh topic1từ kho lưu trữ hiện có và đặt tên nó mastertrong kho lưu trữ mới.

    $ cd /path/to/existing_repo
    $ git push ssh://my_host/new_repo +topic1:master

Kỹ thuật này cho phép bạn giữ lịch sử từ nhánh hiện có.

Lưu ý: kho lưu trữ mới thực sự là một kho lưu trữ từ xa mới . Nếu bạn muốn làm việc với kho lưu trữ mới, bạn phải sao chép nó. Điều sau sẽ sao chép repo mới vào một thư mục làm việc cục bộ có tên new_repo:

$ git clone ssh://my_host/new_repo

Trong ví dụ này, khi bạn sao chép kho lưu trữ mới, bạn sẽ thấy rằng masternhánh là bản sao của topic1nhánh của kho lưu trữ cũ.


10
Nếu bạn thường xuyên đẩy đến repo từ xa, thì đó có lẽ là một lời khuyên tốt cho bạn git remote add origin ssh://my_host/new_repo. Bằng cách này, bạn chỉ cần làm một git push origin [branchname]. Khi sử dụng filepathes UNC (ví windowsshares chẳng hạn), hãy chắc chắn để nhập thêm nguồn gốc từ xa đối với họ như thế này: git remote add origin "//server_name/myapp/"
chris Polzer

Kho lưu trữ mới có thể truy cập được dưới dạng thư mục / kho lưu trữ cục bộ không? Có bất kỳ phương pháp cập nhật nào để làm điều này không?
Nikos Alexandris

@NikosAlexandris Tôi đã thêm thông tin mới, hy vọng nó sẽ hữu ích. Cũng lưu ý rằng repo mới nằm trên máy chủ từ xa không quan trọng. Trong ví dụ, chúng tôi đẩy và sao chép bằng sshgiao thức; nhưng chúng ta có thể tương tự đã sử dụng filegiao thức đã tạo ra kho lưu trữ mới trên cùng một hệ thống tệp.
pestrella

22

Kéo nhánh xuống như bình thường và sau đó đẩy nhánh đến một kho lưu trữ mới mà bạn đã tạo bằng cách sử dụng git init. Bạn sẽ sử dụng mã trông giống như sau:

git push url:///new/repo.git TheBranchFolder

Phương pháp này cũng giữ tất cả các thay đổi trước đó của bạn nếu đó là một điểm cộng cho tình hình.


Tôi đang sử dụng quyền truy cập ssh vào repo của mình, tôi có thể sử dụng nó thay vì URL trong phản hồi của bạn không?
reza

reza: vâng, hãy nghĩ về URL ssh chỉ là một loại URL khác.
amcnabb

vì vậy trên máy chủ git, tôi đã cấp tên nhánh git push / home / git / newBranchGIT .... Bây giờ những gì tôi thấy là một git repo có mọi thứ tôi cần nhưng nhánh duy nhất bây giờ được gọi là tên chi nhánh chứ không phải gốc hoặc chủ. Tôi muốn tên chi nhánh là chính. Hoặc là có một cách tốt hơn để làm điều này?
reza

Chỉ cần thay đổi tên như bạn muốn và cam kết.
JustinDoesWork

21

Nếu bạn không lo lắng về việc mất lịch sử, hãy làm một git checkout mybranchvà sau đó sao chép nội dung thư mục sang một thư mục khác. Trong thư mục đó, xóa thư mục .git và sau đó:

git init; git commit -a -m "Imported from project Y"

2
điều này có giữ lịch sử cam kết của repo gốc không?
Mike Graf,

18
@MikeGraf: Không, như đã chỉ ra trong phần đầu của câu đầu tiên trong câu trả lời: "Nếu bạn không lo lắng về việc đánh mất lịch sử ..."
Justin ᚅᚔᚈᚄᚒᚔ

2
Bạn cũng có thể phải xóa / chỉnh sửa .gitignore, nếu không lệnh trên sẽ để lại các tệp quan trọng tiềm ẩn trong quá trình cam kết.
Dave
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.