Git中合并翻译文件时保留副本而非合并的正确操作方法咨询
Git中合并翻译文件时保留副本而非合并的正确操作方法咨询
嗨,我来帮你梳理下这个场景的最佳操作步骤,既保留原文件的完整历史,又给翻译贡献者的工作正确署名,同时完美实现你要的多语言目录结构:
核心思路
我们要分两步走:先把原仓库的英文文件迁移到en/src目录(保留历史),再把贡献者fork里的葡萄牙语翻译文件迁移到ptbr/src目录(保留他们的提交署名),最后合并两者,让Git把这两个目录的文件当成独立副本,而非同一个文件的冲突版本。
第一步:调整原仓库的文件结构(你自己的仓库操作)
先把你本地的原仓库文件迁移到en/src,用Git的移动命令来保留文件历史:
# 1. 确保你的本地仓库是最新的,没有未提交的变更 git checkout main git pull origin main # 2. 把原src目录移动到en/src下 git mv src en/src # 3. 提交这个结构调整,备注清晰 git commit -m "重构:将原版英文文件迁移至en/src目录" # 4. 推送到远程原仓库 git push origin main
这一步完成后,你的原仓库远程分支就有了en/src的结构,所有原文件的历史都会被Git追踪(用git log --follow en/src/foo就能看到完整历史)。
第二步:让贡献者调整他们的Fork(推荐方式,保留完整署名)
因为贡献者的Fork里已经有了翻译后的src文件,需要让他们把这些文件迁移到ptbr/src,再同步原仓库的最新结构,最后你就能拉取PR合并了:
让贡献者在他们的本地Fork仓库执行:
# 1. 切换到他们做翻译的分支(比如feature/ptbr-translation) git checkout 他们的翻译分支名 # 2. 把翻译后的src目录移动到ptbr/src git mv src ptbr/src # 3. 提交这个结构调整 git commit -m "重构:将葡萄牙语翻译文件迁移至ptbr/src目录" # 4. 添加你的原仓库作为上游远程(如果还没加过) git remote add upstream https://github.com/你的用户名/原仓库名.git # 5. 拉取原仓库的最新结构(就是你刚才推的en/src目录) git fetch upstream git merge upstream/main # 6. 推送到他们自己的Fork远程分支 git push origin 他们的翻译分支名
这一步之后,贡献者的Fork分支里就同时有了en/src(同步你的原仓库)和ptbr/src(他们的翻译文件,带自己的所有提交记录)。
接下来你只需要在GitHub上,从贡献者的Fork分支拉取一个Pull Request,合并到你的原仓库main分支即可。合并后,ptbr/src的文件会完整保留贡献者的提交署名,Git也不会把两个目录的文件当成同一个文件合并。
备选方案:如果你无法让贡献者操作(自己处理Fork)
如果贡献者没时间配合,你可以自己在本地处理他们的Fork,重写提交路径后合并:
# 1. 克隆贡献者的Fork到本地 git clone https://github.com/贡献者用户名/仓库名.git translator-fork cd translator-fork # 2. 用git filter-repo重写所有提交路径:把所有对src/的修改改成ptbr/src/ # (如果没装git filter-repo,先装:sudo apt install git-filter-repo 或者 brew install git-filter-repo) git filter-repo --path-rename src/:ptbr/src/ # 3. 回到你的原仓库本地目录 cd ../your-original-repo # 4. 添加刚才修改后的Fork作为远程 git remote add ptbr-translator ../translator-fork git fetch ptbr-translator # 5. 合并到你的main分支 git checkout main git merge ptbr-translator/main --allow-unrelated-histories # 6. 提交合并备注,推送到远程 git commit -m "合并葡萄牙语翻译:来自[贡献者用户名]的ptbr/src目录" git push origin main
这个方法会把贡献者的所有翻译提交重定向到ptbr/src目录,合并后他们的署名依然会出现在ptbr/src文件的提交历史里。
最后验证
合并完成后,你可以做两个验证:
- 查看英文文件的完整历史:
git log --follow en/src/foo - 查看葡萄牙语文件的贡献者历史:
git log ptbr/src/foo
这两个命令都应该能看到对应的完整提交记录,完美实现你的需求~




