Làm cách nào để sao chép các cam kết từ repo Git này sang repo Git khác?


96

Tuần trước, tôi đã tạo một repo Github và quên chọn giấy phép cho repo. Bây giờ đã có 3 cam kết lớn.

Tôi đã hỏi 3 người đóng góp rằng nó có ổn không, nếu tôi xóa repo và sau đó tạo lại nó với cùng tên và lần này chọn giấy phép khi tạo repo, và họ ở đâu tốt những gì.

Câu hỏi

Có cách nào tôi có được các cam kết vào repo mới (lần này cam kết đầu tiên là tệp LICENSE) và vẫn giữ thông tin meta cam kết không?


1
Bạn vẫn có thể thêm giấy phép vào repo gốc. Xem help.github.com/articles/open-source-licensing/… để biết chi tiết.
edwinksl

Bản sao git
Marc K

Câu trả lời:


163

Có cách nào tôi có được các cam kết vào repo mới (lần này cam kết đầu tiên là tệp LICENSE) và vẫn giữ thông tin meta cam kết không?

Có, bằng cách thêm một điều khiển từ xa và chọn các cam kết trên đầu cam kết đầu tiên của bạn.

# add the old repo as a remote repository 
git remote add oldrepo https://github.com/path/to/oldrepo

# get the old repo commits
git remote update

# examine the whole tree
git log --all --oneline --graph --decorate

# copy (cherry-pick) the commits from the old repo into your new local one
git cherry-pick sha-of-commit-one
git cherry-pick sha-of-commit-two
git cherry-pick sha-of-commit-three

# check your local repo is correct
git log

# send your new tree (repo state) to github
git push origin master

# remove the now-unneeded reference to oldrepo
git remote remove oldrepo

Phần còn lại của câu trả lời này là nếu bạn vẫn muốn thêm LICENSE vào repo trước đó của mình.

Đúng. Bạn có thể đặt cam kết LICENSE của mình làm cam kết đầu tiên bằng cách giảm giá.

Rebasing là cách gits sắp xếp lại thứ tự cam kết trong khi vẫn giữ nguyên tất cả các tác giả cam kết và ngày cam kết.

Khi làm việc trên repo được chia sẻ, thường không được khuyến khích trừ khi toàn bộ nhóm của bạn thông thạo git. Đối với những người không có, họ chỉ có thể sao chép một bản sao mới của kho lưu trữ.

Đây là cách bạn nhận được cam kết LICENSE của mình như là cam kết đầu tiên.

1. Cập nhật và căn cứ lại bản sao cục bộ của bạn

Kiểm tra dự án của bạn và đặt tệp LICENSE trong một cam kết TRÊN ĐẦU của ngăn xếp 3 cam kết hiện tại của bạn.

#create LICENSE file, edit, add content, save
git add LICENSE
git commit -m 'Initial commit'

Sau đó, thực hiện một rebase tương tác trên nhánh chính để THAY ĐỔI các cam kết.

git rebase -i --root

Nó sẽ mở một trình soạn thảo. Di chuyển dòng dưới cùng (cam kết "Cam kết ban đầu" của bạn, cam kết gần đây nhất) lên đầu tệp. Sau đó, lưu và thoát khỏi trình chỉnh sửa.

Ngay sau khi bạn thoát khỏi trình soạn thảo, git sẽ viết các cam kết theo thứ tự bạn vừa chỉ định.

Bây giờ bạn đã cập nhật bản sao cục bộ của kho lưu trữ. làm:

git log

để xác minh.

2. Buộc đẩy trạng thái repo mới của bạn lên github

Bây giờ bản sao của bạn đã được cập nhật, bạn phải đẩy nó lên github.

git push -f origin master

Điều này sẽ yêu cầu github di chuyển nhánh chính đến vị trí mới của nó. Bạn chỉ nên thúc đẩy trong những trường hợp hiếm hoi như thế này khi mọi người làm việc với nó đều biết về sự thay đổi đang chờ xử lý, nếu không nó sẽ khiến các cộng tác viên của bạn bối rối.

3. Đồng bộ hóa các cộng tác viên với github

Cuối cùng, tất cả các cộng tác viên sẽ phải đồng bộ hóa với kho lưu trữ này.

Đầu tiên chúng phải có kho lưu trữ sạch vì lệnh sau có thể phá hủy nếu có các thay đổi chưa được lưu.

# make sure there are no unsaved changes
git status 

# pull the latest version from github
git fetch  

# move their master branch pointer to the one you published to github.
git reset --hard origin/master

Đó là nó. Mọi người nên đồng bộ ngay bây giờ.


1
Câu trả lời chính xác! Cảm ơn!
Kyrol

Tiết kiệm rất nhiều thời gian. Cảm ơn!
an0nh4x0r

9

Tôi đã gặp sự cố tương tự khi tôi quên chuyển một repo vào github của mình và thêm một số cam kết trước khi tôi nhận ra lỗi của mình.

Tôi đã tìm thấy một giải pháp khá đơn giản.

Trước tiên, hãy xóa điều khiển từ xa về kho gốc

git remote remove origin

Thứ hai, thêm điều khiển từ xa vào fork mới trên github của tôi

git remote add origin <my repo URL>

Sau đó, tôi đã chuyển sang mục gốc và tất cả các cam kết của tôi đều hiển thị trên github của tôi.


1
Chỉ cần thêm vào điều này, khi tôi đẩy, tôi phải làm git push --set-upstream origin master, nhưng Git làm cho bạn biết điều này.
MRichards

giải pháp tuyệt vời và dễ dàng!
mecograph

3
  • Git đích = UrlD (nội dung hiện có không quan trọng)
  • SourceGit = UrlS

    git clone UrlS
    
    git remote add origin2 UrlD
    
    git push -f origin2 master
    

Bây giờ Đích sẽ có cùng dữ liệu với Nguồn (Bạn cũng có thể sử dụng origin thay vì origin2)

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.