gpt4 book ai didi

git - 从文件夹创建子模块存储库并保留其 git 提交历史

转载 作者:IT王子 更新时间:2023-10-29 01:24:45 25 4
gpt4 key购买 nike

我有一个 Web 应用程序,它以特定方式探索其他 Web 应用程序。它在 demos 文件夹中包含一些网络演示,其中一个演示现在应该拥有自己的存储库。我想为这个演示应用程序创建一个单独的存储库,并使其成为一个子包 submodule来自主存储库而不丢失其提交历史。

是否可以保留存储库文件夹中文件的提交历史并从中创建存储库并将其用作 submodule相反?

最佳答案

详细解决方案

See the note at the end of this answer (last paragraph) for a quick alternative to git submodules using npm ;)

在下面的回答中,您将了解如何从存储库中提取文件夹并从中创建一个 git 存储库,然后将其包含为 submodule。而不是文件夹。

灵感来自 Gerg Bayer 的文章 Moving Files from one Git Repository to Another, Preserving History

一开始,我们有这样的东西:

<git repository A>
someFolders
someFiles
someLib <-- we want this to be a new repo and a git submodule!
some files

在下面的步骤中,我将引用这个 someLib作为<directory 1> .

最后,我们会有这样的东西:

<git repository A>
someFolders
someFiles
@submodule --> <git repository B>

<git repository B>
someFolders
someFiles

从其他存储库中的文件夹创建一个新的 git 存储库

第一步

获取要拆分的存储库的新副本。

git clone <git repository A url>
cd <git repository A directory>

第二步

当前文件夹将成为新的存储库,因此删除当前的远程文件夹。

git remote rm origin

第三步

提取所需文件夹的历史记录并提交

git filter-branch --subdirectory-filter <directory 1> -- --all

您现在应该拥有一个包含来自 directory 1 的文件的 git 存储库在你的 repo 的根目录中,包含所有相关的提交历史。

第四步

创建您的在线存储库并推送您的新存储库!

git remote add origin <git repository B url>
git push

您可能需要设置 upstream第一次推送的分支

git push --set-upstream origin master

清洁 <git repository A> (可选,见评论)

我们要删除 <git repository B> 的痕迹(文件和提交历史记录)来自 <git repository A>所以这个文件夹的历史只有一次。

这是基于Removing sensitive data来自 github。

转到一个新文件夹并

git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all

替换<directory 1>按要删除的文件夹。 -r将在指定目录内递归执行它:)。现在推到origin/master--force

git push origin master --force

Boss 关卡(见下方注释)

创建一个 submodule来自 <git repository B>进入<git repository A>

git submodule add <git repository B url>
git submodule update
git commit

验证一切是否按预期工作并且push

git push origin master

注意事项

完成所有这些之后,我意识到在我的案例中使用 npm 更合适而是管理我自己的依赖项。我们可以指定 git url 和版本,参见 package.json git urls as dependencies .

如果您这样做,您想要用作需求的存储库必须是一个npm 模块,因此它必须包含一个package.json。文件,否则您将收到此错误:Error: ENOENT, open 'tmp.tgz-unpack/package.json' .

tldr(替代方案)

您可能会发现使用 npm 更容易和 manage dependencies with git urls :

  • 将文件夹移动到新的存储库
  • 运行npm init在两个存储库中
  • 运行npm install --save git://github.com/user/project.git#commit-ish您希望安装依赖项的位置

关于git - 从文件夹创建子模块存储库并保留其 git 提交历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17413493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com