7

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

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

4

2 回答 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

此脚本基于此处看到的大部分说明(添加了一些内容)。

于 2013-08-08T15:37:22.680 回答
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.
于 2020-08-07T08:58:34.483 回答