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

新手上路,请多包涵

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

我已经询问了 3 位贡献者是否可以删除存储库,然后使用相同的名称再次创建它,这次在创建存储库时选择许可证,他们对此很好。

问题

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

原文由 Jasmine Lognnes 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 643
2 个回答

有没有办法让我将提交提交到新的仓库(这次第一个提交是 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 重新排列提交顺序的方式,同时保持所有提交作者和提交日期不变。

在处理共享存储库时,除非您的整个团队都精通 git,否则通常不鼓励这样做。对于那些不是,他们可以克隆存储库的新副本。

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

1. 更新和变基你的本地副本

检查您的项目并将 LICENSE 文件放在当前 3 提交堆栈的顶部的提交中。

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

然后在 master 分支上进行交互式 rebase 以重新 排列 提交。

 git rebase -i --root

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

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

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

 git log

验证。

2. 强制将新的 repo 状态推送到 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

而已。现在每个人都应该同步。

原文由 Moocowmoo 发布,翻译遵循 CC BY-SA 3.0 许可协议

我有一个类似的问题,我忘记在我的 github 上创建一个 repo,并在我意识到我的错误之前添加了几个提交。

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

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

git remote remove origin

其次在我的 github 上添加一个遥控器到新的 fork

git remote add origin <my repo URL>

然后我推送到 origin master,我的所有提交都显示在我的 github 上。

原文由 Russ Bain 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题