如何从Git仓库X复制指定文件到新仓库Y并保留提交历史(不改动X)
解决方案:保留提交历史创建新仓库Y且不改动原仓库X
别担心,完全不用动原仓库X里的任何文件,咱们通过Git的历史过滤工具就能创建符合要求的新仓库Y,同时完整保留目标文件的所有提交历史。以下是具体操作步骤:
步骤1:克隆原仓库X的本地临时副本
首先,咱们先把原仓库X克隆到本地一个临时目录里,所有操作都在这个副本上进行,绝对不会影响远程或本地的原仓库X:
git clone <你的X仓库远程地址> repo-x-temp cd repo-x-temp
步骤2:过滤历史,只保留需要的文件/目录
现在用官方推荐的git filter-repo工具(替代老旧的git filter-branch,更快更可靠),只保留你需要的路径:
git filter-repo --path folder1/ --path folder4/a.cpp --path c.cpp
这条命令会重写整个仓库的提交历史,只保留和folder1、folder4/a.cpp、c.cpp相关的所有提交,最终本地仓库的结构就会变成你想要的Y的样子:
├── folder1 ├── folder4 │ └── a.cpp └── c.cpp
小贴士:如果你的环境还没安装
git filter-repo,可以用包管理器安装(比如Ubuntu用apt install git-filter-repo,Mac用brew install git-filter-repo),或者用pip安装:pip install git-filter-repo。
步骤3:推送到新仓库Y
先在GitHub/Bitbucket上创建一个空的新仓库Y,然后把过滤后的本地仓库推送到这个远程仓库:
# 先移除原仓库的远程关联(可选,避免误推回X) git remote remove origin # 添加新仓库Y的远程地址 git remote add origin <你的Y仓库远程地址> # 推送分支(如果你的主分支是master就替换成master) git push -u origin main
步骤4:清理临时目录
完成推送后,你就可以删掉本地的repo-x-temp临时目录了,原仓库X的结构和文件完全没被改动,完全不影响其他地方的使用。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

