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

2024-10-12 10:28:00
admin
原创
250
摘要:问题描述:上周我创建了一个 Github repo,但忘记为该 repo 选择许可证。现在已经有 3 个大型提交。我曾询问过 3 位贡献者,如果我删除 repo,然后使用相同的名称再次创建它,并在创建 repo 时选择许可证,这样是否可以,他们对此表示同意。问题有什么办法可以将提交放入新的 repo(这次第一...

问题描述:

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

我曾询问过 3 位贡献者,如果我删除 repo,然后使用相同的名称再次创建它,并在创建 repo 时选择许可证,这样是否可以,他们对此表示同意。

问题

有什么办法可以将提交放入新的 repo(这次第一个提交是 LICENSE 文件)并仍然保留提交元信息?


解决方案 1:

有没有办法将提交放入新的 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 添加到您之前的 repo 中。

是的。您可以通过 rebase 将 LICENSE 提交设为第一个提交。

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

在处理共享存储库时,除非您的整个团队都精通 git,否则通常不建议这样做。对于那些不熟练使用 git 的人,他们只需克隆存储库的全新副本即可。

以下说明如何将 LICENSE 提交作为第一次提交。

  1. 更新并重新设置本地副本

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

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

然后在主分支上进行交互式变基来重新排列提交。

git rebase -i --root

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

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

现在您已经更新了存储库的本地副本。请执行以下操作:

git log

验证。

  1. 强制将你的新 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

就这样。现在每个人都应该同步了。

解决方案 2:

我遇到过类似的问题,我忘记将 repo 分叉到我的 github 并添加了几次提交,然后才意识到我的错误。

我发现了一个非常简单的解决方案。

首先删除原始仓库的远程仓库

git remote remove origin

其次,在我的 github 上向新的 fork 添加一个远程仓库

git remote add origin <my repo URL>

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

解决方案 3:

我采用了以下方法:

  • 将源仓库克隆到 /c/SrcRepo 等文件夹

  • 将目标仓库克隆到 /c/DstRepo 等文件夹并切换到目标分支

  • 在目标 repo 的根文件夹中运行以下命令:

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

无需创建额外的远程引用

解决方案 4:

你可以试试这个,它简单又直接。这会将你使用的哈希值之前的所有提交(包括)推送到<last-commit-hash-from-old-repo>其他存储库:

git clone https://github.com/path/to/new-repo.git new-repo
cd new-repo
git remote add old https://github.com/path/to/old-repo.git
git remote update
git merge --allow-unrelated-histories <last-commit-hash-from-old-repo>
git push origin main

如果有人需要将一个仓库中的所有提交推送到另一个仓库作为单个提交(就像我需要的那样),您可以简单地将--squash添加到合并命令中,如下所示:

git clone https://github.com/path/to/new-repo.git new-repo
cd new-repo
git remote add old https://github.com/path/to/old-repo.git
git remote update
git merge --squash --allow-unrelated-histories <last-commit-hash-from-old-repo>
git push origin main

解决方案 5:

根据@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

解决方案 6:

  • 目标 Git = UrlD(现有内容无所谓)

  • SourceGit = UrlS

git clone UrlS

git remote add origin2 UrlD

git push -f origin2 master

现在目标将具有与源相同的数据(您也可以使用 origin 而不是 origin2)

解决方案 7:

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

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

解决方案 8:

我在这里写这个是因为我正在寻找这样的解决方案:

生成原始提交的差异并将其应用于其他存储库:

cd my_origin_repo
git show COMMIT_ID > /tmp/commit.diff
ce my_target_repo
patch -i /tmp/commit.diff

解决方案 9:

例如,如果它是您的存储库的最新提交,您可以撤消更改,创建补丁并将该补丁导入其他存储库。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2560  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1552  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   1  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   2  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   3  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用