Як скопіювати коміти з одного репозиторію Git в інший?


96

Минулого тижня я створив репозитарій Github і забув вибрати ліцензію на репо. Зараз вже є 3 великих комітети.

Я запитав 3 співавторів, чи це нормально, якщо я видалю репо, а потім створюю його знову з тим самим іменем, і на цей раз вибираю ліцензію при створенні репо, і вони де це добре.

Питання

Чи є спосіб отримати коміти в новому репо (цього разу першим комітом є файл ЛІЦЕНЗІЯ) і при цьому зберігати метаінформацію коміту?


1
Ви все ще можете додати ліцензію до оригінального репо. Для отримання детальної інформації див. Help.github.com/articles/open-source-licensing/… .
edwinksl

Відповіді:


163

Чи є спосіб отримати коміти в новому репо (цього разу першим комітом є файл ЛІЦЕНЗІЯ) і при цьому зберігати метаінформацію коміту?

Так, додавши віддалений і вибираючи вишні комміти поверх першого коміту.

# 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

Решта цієї відповіді - якщо ви все-таки хочете додати ЛІЦЕНЗІЮ до свого попереднього репо.

Так. Ви можете розмістити свій ліцензійний коміт як перший коміт шляхом перебазування.

Перебазування - це спосіб змінити порядок комітів, зберігаючи незмінними всі автори комітів та дати комітів.

При роботі над спільним репо, як правило, це не рекомендується, якщо вся ваша команда не вільно володіє git. Для тих, хто не є, вони можуть просто клонувати нову копію сховища.

Ось як ви отримуєте ліцензійний коміт як перший коміт.

1. Оновіть та перебазуйте свою локальну копію

Перевірте свій проект і помістіть файл ЛІЦЕНЗІЇ у коміт НАД ВЕРХОМ поточного 3 стека комітів.

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

Потім зробіть інтерактивне перебазування на гілці master, щоб ПЕРЕМОЖИТИ коміти.

git rebase -i --root

Він відкриє редактор. Перемістіть нижній рядок (ваш коміт "Початковий коміт", останній коміт) у верхню частину файлу. Потім збережіть і закрийте редактор.

Як тільки ви вийдете з редактора, git напише коміти в тому порядку, який ви щойно вказали.

Тепер ваша локальна копія сховища оновлена. робити:

git log

перевірити.

2. Примусово натисніть новий репо-стан на github

Тепер, коли ваша копія оновлена, вам доведеться змусити її натиснути на github.

git push -f origin master

Це скаже github перемістити головну гілку на нове місце. Ви повинні змушувати натискати лише в рідкісних випадках, як це, коли всі, хто працює з ним, знають про очікувані зміни, інакше це заплутає ваших співавторів.

3. Синхронізуйте співавторів з github

Нарешті, всі співавтори повинні будуть синхронізуватися з цим сховищем.

Спочатку вони повинні мати чисті сховища, оскільки наступна команда може бути руйнівною, якщо є незбережені зміни.

# 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

Це воно. Зараз усі повинні синхронізуватися.


1
Чудова відповідь! Дякую!
Кірол

Заощадили багато часу. Дякую!
an0nh4x0r

9

У мене була подібна проблема, коли я забув розгалужити репо до свого github і додав кілька комітів, перш ніж зрозумів свою помилку.

Я знайшов досить просте рішення.

Спочатку вийміть пульт до оригінального репо

git remote remove origin

По-друге, додайте пульт до нової вилки на моєму github

git remote add origin <my repo URL>

Потім я підштовхнувся до master master, і всі мої коміти з'явилися на моєму github.


1
Просто щоб додати до цього, коли я натискав, я повинен був це зробити git push --set-upstream origin master, але Git інформує вас про це.
MRichards

відмінне та просте рішення!
мекограф

3
  • Destination Git = UrlD (наявний вміст не має значення)
  • SourceGit = UrlS

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

Тепер пункт призначення матиме ті самі дані, що й джерело (Ви також можете використовувати джерело замість origin2)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.