我想将一个git项目中的几个目录移动到保存其历史记录的另一个目录中。问题是,我看到的所有示例似乎都在展示如何将目录提取到它自己的git项目中,使用git filter-branch
保留历史记录。是否可以将这些目录从一个存储库移动到另一个存储库,保留其历史记录,如果目标存储库已经有其他版本化文件(与要以任何方式移动的文件不冲突)......?
有人可以告诉我一个如何做到这一点的例子吗?谢谢!
答案 0 :(得分: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
此脚本基于here的大部分说明(添加了一些内容)。
答案 1 :(得分:0)
您可以使用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.