我想将几个目录从一个 git 项目移动到另一个保留其历史记录的目录中。问题是,我看到的所有示例似乎都在展示如何将目录提取到它自己的 git 项目中,并使用git filter-branch
. 是否可以将这些目录从一个存储库移动到另一个存储库,并保留它们的历史记录,如果目标存储库已经有其他版本控制的文件(与要以任何方式移动的文件不冲突)......?
有人可以告诉我一个如何做到这一点的例子吗?谢谢!
我想将几个目录从一个 git 项目移动到另一个保留其历史记录的目录中。问题是,我看到的所有示例似乎都在展示如何将目录提取到它自己的 git 项目中,并使用git filter-branch
. 是否可以将这些目录从一个存储库移动到另一个存储库,并保留它们的历史记录,如果目标存储库已经有其他版本控制的文件(与要以任何方式移动的文件不冲突)......?
有人可以告诉我一个如何做到这一点的例子吗?谢谢!
用我在 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 subtree split
和来做到这一点git subtree add/merge
。假设您的源存储库位于 ~/source 并且您想将 ~/source/subdir 移动到该 git 存储库中某个(可能相同)位置的 ~/target 中:
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
(使用相同的参数)。
split 和 add/merge 命令不需要一起使用。您可以合并到未首先拆分的整个存储库中,也可以通过从该分支克隆将拆分分支转换为存储库:
cd ~
git clone source/ -b split/subdir subdir
cd subdir
g remote add git@github.com/Me/MyNewProject
etc.