Windows GIT 2.20.0如何将文件夹拆分为自己的repo并保留历史记录
WindowsGit2.20.0 使用Bash(和windows命令行git)会得到相同的结果 是否有一种可接受且安全的方法从大型存储库中提取文件夹并将其移动到其自己的REPO中,同时保留回大型REPO的链接以同步回主代码库Windows GIT 2.20.0如何将文件夹拆分为自己的repo并保留历史记录,windows,git,git-filter-branch,Windows,Git,Git Filter Branch,WindowsGit2.20.0 使用Bash(和windows命令行git)会得到相同的结果 是否有一种可接受且安全的方法从大型存储库中提取文件夹并将其移动到其自己的REPO中,同时保留回大型REPO的链接以同步回主代码库 GROUP Company1 Apps SharedApp Company2 Apps 我想将SharedApp提取到自己的回购协议中,但如果可能的话,让它与集团保持联系。所以,如果有人签出组,他们会得到全部,但第三方开发人员可以只签出Apps文
GROUP
Company1
Apps
SharedApp
Company2
Apps
我想将SharedApp提取到自己的回购协议中,但如果可能的话,让它与集团保持联系。所以,如果有人签出组,他们会得到全部,但第三方开发人员可以只签出Apps文件夹
我试过使用:
git filter-branch --prune-empty --subdirectory-filter SharedApp
但这只是返回“找不到要重写的内容”
我也尝试过:
git subtree -P SharedApp -b newbranch
但这只是将整个结构设置在一个新的分支“newbranch”上,并没有像(我认为)文档所说的那样过滤任何内容
我曾考虑过使用次级回购,但我听说它们在未来尤其麻烦
非常感谢您的帮助
编辑:在某个时候,我需要对许多文件夹和库执行此操作,并将它们链接回主repo。这就是问题所在。我不理解你对“安全”的强调。您正在使用git—对克隆所做的任何操作都只会影响该克隆。只要您在影响远程之前验证您在本地所做的工作,您就不会丢失任何东西。你担心的风险是什么 如果您使用
过滤分支
,您将不会有一个简单的方法来整合回购之间未来的变化。并不是说没有办法做到这一点,而是它需要跨越重要的障碍,因为结果与原始结果没有联系
也就是说,如果您想使用过滤器分支
:它这样做的一个原因是没有正确指定路径。确保您提供的是来自工作树根目录的完整路径,这取决于您的文件系统大小写。(在windows上,这通常无关紧要;Mac或*nix可能无关紧要。)如果有一个SharedApp目录,其中的文件直接提交到repo根目录下,那么给出的筛选器参数应该可以
另外,您可能需要添加一个--all
参数(或一个或多个分支名称),以便它知道要重写什么
git filter-branch --prune-empty --subdirectory-filter SharedApp -- --all
在我看来,次级回购是git提供的最接近您要求的东西。是的,很多人不喜欢他们;再说一次,很多人都很好地使用它们。你必须花时间了解如何使用它们,不要期望它们以不同的方式工作,否则就不要使用它们。我不理解你对“安全”的强调。您正在使用git—对克隆所做的任何操作都只会影响该克隆。只要您在影响远程之前验证您在本地所做的工作,您就不会丢失任何东西。你担心的风险是什么 如果您使用
过滤分支
,您将不会有一个简单的方法来整合回购之间未来的变化。并不是说没有办法做到这一点,而是它需要跨越重要的障碍,因为结果与原始结果没有联系
也就是说,如果您想使用过滤器分支
:它这样做的一个原因是没有正确指定路径。确保您提供的是来自工作树根目录的完整路径,这取决于您的文件系统大小写。(在windows上,这通常无关紧要;Mac或*nix可能无关紧要。)如果有一个SharedApp目录,其中的文件直接提交到repo根目录下,那么给出的筛选器参数应该可以
另外,您可能需要添加一个--all
参数(或一个或多个分支名称),以便它知道要重写什么
git filter-branch --prune-empty --subdirectory-filter SharedApp -- --all
在我看来,次级回购是git提供的最接近您要求的东西。是的,很多人不喜欢他们;再说一次,很多人都很好地使用它们。你必须花时间了解如何使用它们,不要期望它们以不同于它们的方式工作,否则就不要使用它们。简而言之,我的答案是不使用它们。它们完全是危险的,正如我一开始就怀疑的那样 只是谷歌“我应该在git中使用子repos吗”“git模块安全吗”“git子模块合并冲突”等等 虽然建议是子模块是答案,它们是安全的,但我不同意;一些颇受尊敬的人的许多网络博客也是如此 子模块似乎工作了一段时间,但在合并开发分支时,子模块变得越来越老,各种各样的裂缝开始显示我无法工作,这让我担心。我有10年以上的TFS,3年的SVN和1年的GIT,所以我可以合理地使用源代码控制系统。但在我的一生中,我无法理解这一点,也无法“自信地”合并这些差异,因为随着时间的推移,分支之间的差异越来越大——即使在我同步并强制所有devs机器上的两个子模块容器相同之后 我在GIT文档/blos/articles中找不到任何建议将子模块放置在存储库中并进行分支的内容。这就是我所做的,但在合并子功能分支时,在其他各方未触及的文件中出现了合并冲突,更糟糕的是,旧得多的代码更改被视为新的,这确实令人担忧,因为您无法信任合并过程 我注意到这种行为只发生在子模块分支中,实际的开发分支合并得很好,而不管子模块的wierd行为如何 在经历了许多浪费和痛苦的夜晚之后,我终于非常小心地将子模块合并到主分支中,并放弃了这个想法
如果我需要GIT好,那么我恐怕我根本没有时间照看子模块,所以我回到了愚蠢的老GIT 简言之,我的答案是:不,不要使用它们,它们非常危险,正如我在第一次解放军中所怀疑的那样