如何将提交从一个Git存储库复制到另一个?


96

上周,我创建了一个Github存储库,却忘记选择该存储库的许可证。现在已经有3个大型提交。

我问了3个贡献者是否还可以,是否删除了回购文件,然后使用相同的名称再次创建它,这一次在创建回购文件时选择了许可证,他们会在那做些什么。

有什么办法可以将提交提交到新的存储库中(这次第一次提交是LICENSE文件),并且仍然保留提交元信息?


1
您仍然可以将许可证添加到原始存储库。有关详细信息,请参见help.github.com/articles/open-source-licensing/…
edwinksl

Answers:


163

有什么办法可以将提交提交到新的存储库中(这次第一次提交是LICENSE文件),并且仍然保留提交元信息?

是的,通过在第一次提交的基础上添加一个远程站点并挑选这些提交来进行。

# 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

该答案的其余部分是,如果您仍然想将LICENSE添加到以前的仓库中。

是。您可以通过重新定基将LICENSE提交作为第一个提交。

变基是重新排列提交顺序同时保留所有提交作者和提交日期完整的gits方法。

在共享仓库上工作时,通常不建议这样做,除非您的整个团队精通流利。对于那些不是的人,他们可以克隆存储库的新副本。

这是您第一次获得LICENSE提交的方式。

1.更新并重新建立本地副本

签出您的项目,并将LICENSE文件放入当前3个提交堆栈的ON TOP TOP中。

#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将master分支移动到新位置。您仅应在这种罕见的情况下强制推送,每个人都在与它一起工作时知道即将发生的更改,否则它将使您的合作者感到困惑。

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
好答案!谢谢!
凯尔(Kyrol)'18年

节省了很多时间。谢谢!
an0nh4x0r

9

我有一个类似的问题,我忘了在我的github上存储一个仓库,并在意识到自己的错误之前添加了几次提交。

我找到了一个非常简单的解决方案。

首先将遥控器移至原始仓库

git remote remove origin

第二个在我的github上的新fork中添加一个遥控器

git remote add origin <my repo URL>

然后,我推送给Origin Master,所有提交都显示在github上。


1
补充一点,当我推动时,我不得不做git push --set-upstream origin master,但是Git使您意识到这一点。
MRichards

简便的解决方案!
mecograph '19

3
  • 目标Git = UrlD(现有内容无关紧要)
  • SourceGit =网址

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

现在,目的地将与来源具有相同的数据(您也可以使用origin代替origin2)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.