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

2024-10-12 10:28:00
admin
原创
80
摘要:问题描述:上周我创建了一个 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:

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用