如何提取git子目录并从中生成子模块?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (82)

几个月前,我开始了一个项目,并将所有内容存储在主目录中。在我的主目录“Project”中,有几个子目录包含不同的内容:项目/纸张包含一个用LaTeProject/Sourecode/RailsApp编写的文档,包含我的Rails应用程序。

“Project”是GITify,在“纸质”和“RailsApp”目录中都有很多提交。现在,由于我想在我的“RailsApp”中使用Cruisecontrol.rb,我想知道是否有一种方法可以在不丢失历史的情况下从“RailsApp”中生成一个子模块。

有什么建议吗?

提问于
用户回答回答于

Examples剖面手册页显示了如何将子目录提取到自己的项目中,同时保留所有的历史记录,并丢弃其他文件/目录的历史记录(这正是要寻找的)。

重写存储库,使其看起来像是foodir/已经成为它的项目根,并抛弃了所有其他历史: git过滤器-分支-子目录-过滤器foodir--全部 因此,可以,例如,将库子目录转换为自己的存储库。 注意--分离filter-branch来自修订选项的选项,以及--all重写所有分支和标记。

用户回答回答于

现在有一种比手动使用git过滤器分支更简单的方法:GIT子树

安装

git clone https://github.com/apenwarr/git-subtree.git

cd git-subtree
sudo rsync -a ./git-subtree.sh /usr/local/bin/git-subtree

或者如果你想要手册页

make doc
make install

使用

把一个大的块分成小块:

# Go into the project root
cd ~/my-project

# Create a branch which only contains commits for the children of 'foo'
git subtree split --prefix=foo --branch=foo-only

# Remove 'foo' from the project
git rm -rf ./foo

# Create a git repo for 'foo' (assuming we already created it on github)
mkdir foo
pushd foo
git init
git remote add origin git@github.com:my-user/new-project.git
git pull ../ foo-only
git push origin -u master
popd

# Add 'foo' as a git submodule to `my-project`
git submodule add git@github.com:my-user/new-project.git foo

有关详细文件(手册页),请阅读git-subtree.txt...

扫码关注云+社区