Bir Git deposundan diğerine commit nasıl kopyalanır?


103

Geçen hafta bir Github deposu oluşturdum ve depo için bir lisans seçmeyi unuttum. Şimdi zaten 3 büyük kayıt var.

Katkıda bulunan 3 kişiye sorun olup olmadığını sordum, depoyu silip sonra aynı isimle tekrar oluşturursam ve bu sefer depoyu oluştururken lisansı seçerek ve onlar ne iyi.

Soru

İşlemleri yeni depoya almamın bir yolu var mı (bu sefer ilk taahhüt LICENSE dosyasıdır) ve hala commit meta bilgilerini saklıyor mu?


1
Yine de orijinal depoya bir lisans ekleyebilirsiniz. Ayrıntılar için help.github.com/articles/open-source-licensing/… bakın.
edwinksl


Yanıtlar:


174

İşlemleri yeni depoya almamın bir yolu var mı (bu sefer ilk taahhüt LICENSE dosyasıdır) ve hala commit meta bilgilerini saklıyor mu?

Evet, bir uzaktan kumanda ekleyerek ve ilk taahhüdünüzün üzerine kesinleri seçerek.

# 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

Bu cevabın geri kalanı, LİSANSI bir önceki deponuza hala eklemek istiyorsanız.

Evet. Yeniden ödeme yaparak LİSANS taahhüdünüzü ilk taahhüt olarak yerleştirebilirsiniz.

Rebasing, tüm commit yazarlarını ve commit tarihlerini olduğu gibi tutarken commit sırasını yeniden düzenlemenin yoludur.

Paylaşılan bir depo üzerinde çalışırken, ekibinizin tamamı git-flu olmadığı sürece genellikle tavsiye edilmez. Olmayanlar için, deponun yeni bir kopyasını klonlayabilirler.

İşte ilk taahhüt olarak LİSANS taahhüdünüzü nasıl alacağınız.

1. Yerel kopyanızı güncelleyin ve yeniden yazın

Projenize göz atın ve LICENSE dosyasını mevcut 3 commit yığınınızın ÜSTÜNDE bir commit içine yerleştirin.

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

Ardından , taahhütleri YENİDEN DÜZENLEMEK için ana dalda etkileşimli bir yeniden ödeme yapın .

git rebase -i --root

Bir editör açacaktır. En alt satırı ("İlk yürütme" taahhüdünüz, en son işleminiz) dosyanın en üstüne taşıyın. Ardından düzenleyiciyi kaydedin ve çıkın.

Düzenleyiciden çıkar çıkmaz git, commit'leri az önce belirttiğiniz sırayla yazacaktır.

Artık deponun yerel kopyasını güncellediniz. yapmak:

git log

doğrulamak için.

2. Yeni depo durumunuzu github'a zorlayın

Artık kopyanız güncellendiğine göre, onu github'a zorlamanız gerekir.

git push -f origin master

Bu, github'a ana şubeyi yeni konumuna taşımasını söyleyecektir. Zorla sadece bunun gibi, onunla çalışan herkesin bekleyen değişikliğin farkında olduğu nadir durumlarda zorlamalısınız, aksi takdirde işbirlikçilerinizin kafasını karıştırır.

3. Ortak çalışanları github ile senkronize edin

Son olarak, tüm ortak çalışanların bu depoya senkronize olması gerekecektir.

İlk temiz depoları olmalıdır kaydedilmemiş değişiklikler varsa aşağıdaki komutu yıkıcı olabilir olarak.

# 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

Bu kadar. Şimdi herkes senkronize olmalı.


1
Mükemmel cevap! Teşekkürler!
Kyrol

Çok zaman kazandım. Teşekkürler!
an0nh4x0r

9

Github'ıma bir repo yüklemeyi unuttuğumda benzer bir sorun yaşadım ve hatamı fark etmeden önce birkaç işlem ekledim.

Oldukça basit bir çözüm buldum.

Önce uzaktan kumandayı orijinal depoya kaldırın

git remote remove origin

İkincisi, github'umdaki yeni çatala bir uzaktan kumanda ekle

git remote add origin <my repo URL>

Sonra kaynak yöneticisine gittim ve tüm taahhütlerim github'ımda göründü.


1
Sırf buna eklemek için git push --set-upstream origin master, bastığımda yapmak zorundaydım ama Git bunun farkına varmanızı sağlıyor.
MRichards

harika ve kolay çözüm!
mecograph

3
  • Hedef Git = UrlD (mevcut içerik önemli değil)
  • SourceGit = UrlS

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

Artık Hedef, Kaynak ile aynı verilere sahip olacak (Origin2 yerine orijin de kullanabilirsiniz)


0

Aşağıdaki yaklaşımı kullandım:

  • Kaynak depoyu / c / SrcRepo gibi bir klasöre kopyalayın

  • Hedef depoyu / c / DstRepo gibi bir klasöre kopyalayın ve hedef şubeye geçin

  • Hedef deponun kök klasöründe şu komutu çalıştırın:

    git pull / c / SrcRepo srcBranch --allow-unrelated-geçmişleri

Ek bir uzaktan referans oluşturmaya gerek yok


0

@ Moocowmoo'nun cevabına dayanıyor, ancak biraz daha kolaylaştırmaya çalışıyor

Bunun farklı yaptığı şey, sadece uzaktan kumandanın doğru olduğunu varsayarak, çatışmaları olabildiğince önlemeye çalışmaktır.

Bununla birlikte, silinen dosyaları iyi işlemediğinden, hala bir manuel öğe vardır.

# assuming you are already on the branch you want to be
git remote add oldrepo https://github.com/path/to/oldrepo
git fetch oldrepo

# take all or subset of changes from a branch
git cherry-pick --strategy recursive --strategy-option theirs oldestCommitHash^..latestCommitHash

# or take all changes included in a specific merge commit (easiest)
git cherry-pick --strategy recursive --strategy-option theirs mergeCommitHash^..mergeCommitHash

# handling deleted files/unhandled conflicts
# just keep repeating this section
git mergetool
# either c/m or d based on if you want to keep or delete the files
git cherry-pick --continue
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.