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

标签 git

我想将几个目录从一个 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

此脚本基于所见的大部分说明here (添加了一些内容)。

关于git - 将多个目录从一个 git 项目移动到另一个,保留它们的历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17952708/

相关文章:

git - 如何在 post-receive hook 后执行命令

git - 修改对共享仓库的 Git 提交

Git merge 和修复带有两个分支的混合空间和制表符

linux - 将 git 命令与 -q 一起使用,但在失败时不会保持安静?

git:在输入消息的过程中中止提交

git - Meteor:从 Github 克隆存储库时出错

带有 autocrlf=false 的 Git 仍然产生 "warning: CRLF will be replaced by LF"消息

git - 如何附加分支名称并提交到 git 存档输出文件?

git - Git 是否以某种方式有效地存储子提交列表

git - Visual Studio : Change default path for repositories for GIT plugin