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

时间:2016-05-26 22:00:39

标签: linux git github

上周我创建了一个Github回购,但忘记为回购选择许可证。现在已有3次大型提交。

我已经问过3个贡献者是否可以,如果我删除了回购然后再使用相同的名称再次创建它,这次在创建回购时选择许可证,那么它们就好了。

问题

我有没有办法让提交到新的repo(这次第一次提交是LICENSE文件)并且仍然保留提交元信息?

6 个答案:

答案 0 :(得分:67)

  

我有没有办法让提交到新的repo(这次第一次提交是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添加到你以前的回购中。

是。您可以通过rebasing将LICENSE提交作为第一个提交。

重新引用是重新排列提交顺序的方法,同时保持所有提交作者和提交日期不变。

在处理共享回购时,除非你的整个团队都很流利,否则通常不鼓励这样做。对于那些没有的人,他们只能克隆一个新的存储库副本。

以下是您如何将LICENSE提交作为第一次提交。

1。更新并重新定义本地副本

检查项目并将LICENSE文件放在当前3个提交堆栈的提交ON TOP中。

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

然后在主分支上进行交互式rebase,以 REARRANGE 提交。

git rebase -i --root

它会打开一个编辑器。将底线(您的“初始提交”提交,最近的提交)移动到文件的顶部。然后保存并退出编辑器。

一旦退出编辑器,git将按您刚刚指定的顺序编写提交。

您现在已更新存储库的本地副本。做:

git log

验证。

2。强制将新的repo状态推送到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 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

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

首先将遥控器移至原始存储库

git remote remove origin

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

git remote add origin <my repo URL>

然后我推送到原始主机,我的所有提交都显示在我的github上。

答案 3 :(得分:0)

我使用了以下方法:

  • 将源存储库克隆到/ c / SrcRepo这样的文件夹

  • 将目标存储库克隆到/ c / DstRepo这样的文件夹,然后切换到目标分支

  • 在目标存储库的根文件夹中,运行命令:

    git pull / c / SrcRepo srcBranch --allow-unrelated-histories

无需创建其他远程引用

答案 4 :(得分:0)

基于@Moocowmoo的答案,但试图简化它

这样做的不同之处在于,只要假设遥控器是正确的,便会尝试尽可能避免冲突。

但是,它不能很好地处理已删除的文件,因此仍然存在一个手动元素。

# 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

答案 5 :(得分:0)

就我而言,我需要找出新旧存储库之间的差异。所以在新的 repo 中添加了旧的。

git remote add old https://gitlab.site.az/old-blog.git

获取所有遥控器

git fetch --all

查找不同的提交

git log --graph --oneline --pretty=format:"%h%x09%an%x09%ad%x09%s" --abbrev-commit --date=relative develop..old/develop

获取您选择的提交

git cherry-pick SHA1 SHA2 SHA4