我有一个Git存储库,其中包含许多子目录.现在我发现其中一个子目录与另一个子目录无关,应该分离到一个单独的存储库.
如何在将文件的历史记录保存在子目录中的同时执行此操作?
我想我可以制作一个克隆并删除每个克隆的不需要的部分,但我想这会给我一个完整的树,当检查旧版本等.这可能是可以接受的,但我宁愿能够假装两个存储库没有共享历史记录.
为了说清楚,我有以下结构:
XYZ/
.git/
XY1/
ABC/
XY2/
Run Code Online (Sandbox Code Playgroud)
但我想这样做:
XYZ/
.git/
XY1/
XY2/
ABC/
.git/
ABC/
Run Code Online (Sandbox Code Playgroud) 基本上我的问题是我不能让git明白这~/main-project/submodule是一个子模块.
我对git子模块有很好的经验:
在我的dotfiles存储库中我创建了.gitmodules文件,~/dotfiles-repo并添加了路径和URL.从那时起,如果我对子模块中的文件进行更改并运行git status,我会得到类似的结果:.vim/bundle/auto-complete (new commits) # in red
我创建了.gitmodules文件~/main-project但是:
~/main-project/submodule,甚至推的变化,我没有得到这样一个类似的反应<submodule> (new commits) # in red中运行时git status在~/main-project.我只是得到了在这些目录中所做的更改当我点击github这些目录的文件夹链接时,它并没有指示我自己的存储库,但我留在同一个存储库中.
~/main-project/submodule到索引中吗?我读过这个问题导致我得到了这个答案,但我不确定是否需要git-subtree.我不想做那些可能难以改变的事情.
编辑:这个建议的重复解决方案也不起作用,我收到了一个错误
Updates were rejected because the remote contains work that you do not have locally.似乎@GabLeRoux几乎告诉我要推 …
我有这个git存储库,其中包含两个文件夹:binary-search和poker.例如,http://github.com/soulnafein/code-katas
我想将这些文件夹放入子模块并保留其更改历史记录.
我怎样才能做到这一点?
我刚刚开始拆分包含所有产品代码的Git存储库,其中包括共享库,服务器,客户端和工具代码.
作为消除我们对DCVS的一些技术债务的一部分,我们建议将我们的共享客户端和服务器库移动到Nuget存档,该存档将对开发和发布分支具有严格控制的推送权限,以强制推动拉动请求我们一直懒散.分裂部分没什么大不了的; 我根据git filter-branch自己的喜好量身定制了历史保留,现在我正在研究如何将存储库重新组合在一起.
目前,在我准备将它们打包(以及正确的单元测试等)之前,库并不完全清晰,需要进行一些重构,并且希望能够对两个存储库进行更改,重点是代码审查,作为中短期解决方案.
我已经阅读了足够的内容,git subtree并git submodule了解他们的相对优势和劣势,但仍然对于该怎么做有冲突.虽然绝大多数资源git submodule由于其对那些不知道如何使用它的人的脆弱性而受到反对使用(有罪!),但它的另一种选择git subtree似乎缺乏我正在寻找的显式引用功能.
如果有人有类似我正在寻找的设置,或者有不同的工作流程,你能评论一下吗?当我"等待一口"时,我将离开并测试这两种策略,并希望有更高的评估.
我有以下项目设置:
Solution A
Project 1 (轻量级组件)Project 2(包含很多文件并依赖于Project 1)Solution A是一个单一的git存储库.然后我创建了另一个解决方案,发现我可以重用甚至更新其功能Project 1.所以我的第二个解决方案可能看起来像这样:
Solution B
Project 1 (必须分享!)Project 3(取决于Project 1).现在我想Project 1成为一个共享组件.也就是说,每当我Project 1从任一解决方案(A或B)更改源代码时,我都需要另一个相应的更新.
也许这有点像git的子模块功能.但是,我能够使用它的唯一方法是将整体指定为子模块.由于体积庞大,这并不是我想要的理想选择.我只需要它的一小部分就是一个子模块.Solution ASolution BSolution A
我知道它可以在svn中完全按照我的描述工作:在svn:externals属性中指定外部存储库中的目录.
有什么提示吗?或许,我错过了什么?
更新:我试图简化这里的真实示例以清楚地解释我的选项,但这并没有真正起作用.到目前为止,下面的链接示例过于笼统,甚至无法使用这个简单的示例.
我能够一直用SVN做这种事情并且非常熟练.现在我发现在Git中非常困难,并开始相信我的历史基本上太过密集,无法将它拉开.
真实世界的问题:我已经移动并重命名了十几个文件.他们的历史与数百个其他文件的历史混杂在一起,我想完全删除历史记录.
在SVN中,我可以使用dump/include-filter/exclude-filter/load序列来修剪存储库,很少我可能需要在加载之前在转储文件中手动重命名路径.
像这样的东西,我会做的:
SET Includes=trunk/src/Foo.aaa trunk/src/Foo.bbb trunk/src/Foo trunk/src/Bar
SET Excludes=trunk/src/Bar/Blah.aaa trunk/src/Foo/Blah.aaa
svnadmin dump FooSrc > Full.dump 2> Dump.log
svndumpfilter include %Includes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs < Full.dump > Filter_1.dump 2> Filter_1.log
svndumpfilter exclude %Excludes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs < Filter_1.dump > Filter_2.dump 2> Filter_2.log
svnadmin create FooDest
svnadmin load FooDest --ignore-uuid < Filter_2.dump > Load.log 2> Load_Errors.log
Run Code Online (Sandbox Code Playgroud)
有没有人有一个很好的例子,这不仅仅是一个简单的删除单个文件或导出单个子目录?
我可以定义文件集的最简单方法是使用7个目录路径的列表.这些目录中的所有内容都需要保存,外部的所有内容都需要从历史记录中删除.
简化问题:
我有一个Git存储库,它有一些我想要提取到自己的存储库中的文件.问题是这些文件是在原始存储库的整个历史记录中创建和修改的,因此我无法弄清楚如何干净地提取它们.
以下是我的历史记录的要点(只有更多的提交和更多要忽略).正如你所看到的,我显然不打算稍后将这些文件从历史中挑选出来:
commit 4a09d3f977a8595d9e3f61766a5fd743e4265a56
M src/Foo/Bar/FileToExtract2.foo
A src/Foo/Bar/FileToExtract3.bar
D src/Foo/AnotherFileToIgnore.txt
commit 05d26f23518083270cc45bf037ced29bec45e064
M src/Foo/Blah/IgnoreThisOneToo.foo
M src/Foo/AnotherFileToIgnore.txt
commit 343187228f4bd8e4427395453034c34ebd9a95f3 …Run Code Online (Sandbox Code Playgroud) 我有一个现有的SVN仓库,我想将其中的一部分导入到现有的Git仓库中.任何人都可以给我一个高级概述这样做的命令吗?
摘要:
我有一种感觉,这涉及到git filter-branch一些奇怪的合并.任何帮助,将不胜感激.
我有一个git项目,我用于最近发表的科学论文.在项目中,我有子目录doc(拆分为doc/paper doc/talks)results src等等.
现在我想发布我的源代码(但不是我的演示幻灯片等).让人们只访问src子目录的最佳方法是什么?我会发布一个zip文件来拍摄当前src目录的快照,但我希望人们能够轻松获得更新.
非常感谢.奥利弗