将多个目录从一个Git项目移动到另一个项目,保留它们的历史记录。

7
我想把一个git项目中的几个目录移动到另一个项目中,同时保留它们的历史记录。问题是,我看到的所有示例都似乎是展示如何使用 git filter-branch 将目录提取到自己的git项目中,并保留历史记录。如果目标存储库已经有其他版本控制的文件(与要移动的文件不冲突),是否可以将这些目录从一个存储库移动到另一个存储库,并保留它们的历史记录?请问有人可以示范一下如何做吗?谢谢!

请指定您希望合并的历史记录如何显示:按日期排序的提交,一个项目紧跟着另一个项目,...? - krlmlr
@krlmlr: 你能给我展示一下两种或者其中一种的例子吗?我认为按日期排序会很好。 - carlspring
我的评论只是指出问题规范中的一个小错误。这个链接对你有帮助吗:https://dev59.com/O3M_5IYBdhLWcg3wUxdB? - krlmlr
2个回答

1
用我在bash中编写的小脚本回答自己的问题(确保你先阅读并备份了文件)。
#!/bin/bash

gitURL=$1
project=$2
srcProjectBaseDir=$3
destProjectBaseDir=$4

# Remove stale checkouts in order to do a clean clone
rm -rf ${srcProjectBaseDir}

git clone --no-hardlinks $gitURL ${srcProjectBaseDir}
cd ${srcProjectBaseDir}
git remote rm origin

# These make sure your extracted module is called as the directory's name.
# If this is of no interest to you, comment out these three lines and you
# should be alright.
mkdir temp
git add temp
git mv ${project}/ temp/

git commit -m "Refactoring: Isolated files for filter-branch."

git filter-branch --subdirectory-filter temp HEAD

git add .
git commit -m "Refactoring: Filter branched."


if [ ! -d ${destProjectBaseDir} ]; then
    mkdir ${destProjectBaseDir}
    cd ${destProjectBaseDir}
        git init
    cd ..
fi

cd ${destProjectBaseDir}
git remote add repositoryAbranch ${srcProjectBaseDir}
git pull repositoryAbranch master
git remote rm repositoryAbranch

这个脚本基于大部分指令 在这里(添加了一些内容)。


这个不起作用。 git filter-branch会抹掉所有的历史记录。 - Richard Barraclough
${project} 代表什么?你的脚本只适用于单个目录吗? - Freedom

0
你可以使用git subtree splitgit subtree add/merge去实现这个目标。假设你的源代码库在~/source,想要将~/source/subdir移动到~/target的某个位置(可能是相同的位置)在git代码库中:
cd ~/source
git subtree split -P subdir -b split/subdir
cd ~/target
git remote add source ../source
git fetch source split/subdir
git subtree add source/split/subdir -P new_subdir

稍后,如果源代码有更新的内容,你可以再次执行完全相同的步骤,只是最后一步不同,变为使用 git subtree merge 而不是 git subtree add(参数保持不变)。
拆分和添加/合并命令不必同时使用。你可以合并一个未经拆分的完整仓库,也可以仅仅将拆分的分支转换为一个仓库,通过从该分支进行克隆操作即可:
cd ~
git clone source/ -b split/subdir subdir
cd subdir
g remote add git@github.com/Me/MyNewProject
etc.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接