将多个目录从一个git项目移动到另一个git项目,保留其历史记录

时间:2013-07-30 16:39:28

标签: git

我想将一个git项目中的几个目录移动到保存其历史记录的另一个目录中。问题是,我看到的所有示例似乎都在展示如何将目录提取到它自己的git项目中,使用git filter-branch保留历史记录。是否可以将这些目录从一个存储库移动到另一个存储库,保留其历史记录,如果目标存储库已经有其他版本化文件(与要以任何方式移动的文件不冲突)......?

有人可以告诉我一个如何做到这一点的例子吗?谢谢!

2 个答案:

答案 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 splitgit 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.