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

2024-10-12 10:28:00
admin
原创
237
摘要:问题描述:上周我创建了一个 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2048  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1454  
  汽车行业正处于快速变革的时代,产品生命周期管理(PLM)流程的优化与再造对于企业的竞争力至关重要。关键链管理工具作为提升PLM流程效率和质量的有效手段,在汽车行业中得到了广泛应用。通过持续改进实践,这些工具能够更好地适应企业发展需求,助力汽车企业在激烈的市场竞争中脱颖而出。关键链管理工具在PLM流程中的重要性关键链管理...
plm软件   1  
  法规变化对 PLM 合规性管理的挑战全球法规处于不断变化的动态之中,这给 PLM(产品生命周期管理)合规性管理带来了诸多棘手的挑战。首先,法规的更新速度日益加快,不同国家和地区在产品安全、环保、知识产权等方面的法规要求持续演变。企业需要时刻关注这些变化,确保产品从设计、研发到生产、销售的全流程都符合最新法规。然而,要精...
PLM软件   1  
  在项目管理领域,PLM(产品生命周期管理)项目的顺利推进至关重要,而其中项目进度的有效控制是关键环节。尤其是在设定了明确的时间节点如2025年这样的目标时,如何运用甘特图进行时间跟踪并优化,进而实现项目进度的压缩,成为众多项目管理者关注的焦点。合理的进度压缩技巧不仅能确保项目按时交付,还能提升资源利用效率,降低成本,增...
plm项目管理系统是什么   1  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用