我想拆分一个非常标准的存储库。原始存储库必须具有以下结构:
root
|-AAA
|-BBB
|-BBB1
|-BBB2
|-CCC
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下命令将目录 BBB1 及其所有内容提取到一个单独的存储库中
git filter-branch --subdirectory-filter BBB/BBB1 -- --all
Run Code Online (Sandbox Code Playgroud)
这导致 git 重写一堆提交并以 git 的最终语句结束
Ref 'refs/heads/master' was rewritten
Run Code Online (Sandbox Code Playgroud)
所以这对我来说似乎很好。但是,当我看看到根目录下的git结束后,库不再包含任何的源文件,但只有git的在文件夹的根。使用 SourceTree 浏览此存储库我可以在日志中看到(可能)正确的提交,这些提交只会影响BBB1,但每次提交不再引用任何文件,因为它们都消失了!
我究竟做错了什么?为什么所有文件都消失了,甚至是我实际过滤的文件?
提前致谢!
西蒙
我的要求:将一个 git repo 分解为多个 git repos,保留与原始 repo 中相同的目录结构,并保留复制到新 repo 的文件的提交历史记录。我已经尝试过的:
首先,我根据http://gbayer.com/development/moving-files-from-one-git-repository-to-another-preserving-history/ 中的建议尝试了git filter-branch --subdirectory-filter 结果:历史被维护,但只能在运行时查看 git log --follow 另外,在 Github 上无法看到原始提交历史。它只是将我的合并提交显示为该文件的唯一提交,并且不显示任何以前的提交。我仍然可以忍受这个限制并接受它作为解决方案。但我对这种方法的另一个担忧是,对于我想要复制的每个文件夹和每个文件,我需要多次克隆原始存储库,并且每次都重复所有 12 或 13 个步骤。我想知道是否有更简单的方法,因为我要移动很多文件。此外,由于该帖子已有 5 年历史,只是想知道是否有更新的更简单的解决方案可用?(出人意料的是,谷歌大多将这个博客显示为第一个搜索结果)
我尝试的下一件事是对较早的 Greg Bayer 帖子的评论http://gbayer.com/development/moving-files-from-one-git-repository-to-another-preserving-history/#comment-2685894846 这个解决方案使使用git subtree split使事情变得更简单,但结果与第一种情况中列出的结果相同。
然后我根据这个答案尝试了git log --patch-with-stat 和git am选项/sf/answers/799838301/ 结果:这通常会在应用补丁时遇到合并错误。我尝试了使用-m --first-parent这个答案的建议之一。这解决了错误,但没有将任何合并扩展到他们的提交中,只是将合并列为单个提交。因此大部分提交历史都丢失了。所以我添加了--3way 的另一个选项。这一遍又一遍地通过提交,并没有导致任何可接受的解决方案。
总之,我更喜欢使用第三个解决方案,如果只有一个选项可以将合并中的所有提交都列在新存储库的历史记录中。否则我必须坚持第一个解决方案,这在我的情况下有点不方便和乏味。任何建议,帮助将不胜感激。
谢谢。
我一直在关注这个问题的答案将Detach子目录分离到单独的Git存储库中,并且只有一个分支上的简单Subdirectories取得了一些成功,但现在我遇到了一个遍布多个分支的子目录,所以很简单
git filter-branch --subdirectory-filter SUBDIRECTORY HEAD
Run Code Online (Sandbox Code Playgroud)
不做这个工作.
我是否必须切换到每个分支并运行filter-branch命令,或者是否有可以通过完整历史记录进行空白更改的内容?
我想将我的git存储库中的文件夹拆分为新文件夹.但我想保留所有与此文件夹相关的所有打开/关闭分支和历史记录.
\ Source Repo
--\ AAA
--\ BBB
----\ DDD
----\ EEE
--\ CCC
\ New Repo 1
--\ AAA
--\ CCC
\ New Repo 2 (BBB subfolder)
--\ DDD
--\ EEE
Run Code Online (Sandbox Code Playgroud)
我按照此处描述的步骤https://help.github.com/articles/splitting-a-subfolder-out-into-a-new-repository/ - 但这仅适用于单个分支.最后 - 我获得了所有(?)提交的新存储库,但没有分支信息.
我尝试使用--all参数为所有分支执行此操作,但我不清楚如何将所有重写的分支推送到空的远程仓库.
这是我目前的情况:
$ git clone https://github.com/USERNAME/REPOSITORY-NAME
$ cd REPOSITORY-NAME
$ git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME -- --all
Run Code Online (Sandbox Code Playgroud)
在这一点上,如果我看看我的本地回购,我似乎有所有历史和所有分支在遥控器的起源.
$ git remote -v
origin https://github.com/USERNAME/REPOSITORY-NAME.git (fetch)
origin https://github.com/USERNAME/REPOSITORY-NAME.git (push)
$ git remote set-url origin https://github.com/USERNAME/NEW-REPOSITORY-NAME.git
$ git remote -v
origin https://github.com/USERNAME/NEW-REPOSITORY-NAME.git …Run Code Online (Sandbox Code Playgroud) 我想将我们的 SVN 存储库迁移到git.
我们当前的存储库是一个巨大的单例堆,包含许多 Visual Studio 解决方案,所有解决方案都驻留在存储库的单独子目录中。
当将其转换为时,git我想将 SVN 存储库拆分为git每个解决方案的单独存储库,同时维护每个解决方案的历史记录。
我不希望在我们未来的所有git存储库中保留整个 SVN 存储库的历史记录。我在这些未来的git存储库中想要的只是特定子目录的历史记录。
这可能吗?
当前SVN存储库文件结构:
svn_base
|-- Solution1
| |-- 1.cs
| |-- 1.csproj
| |-- 1.sln
|-- Solution1
| |-- 2.cs
| |-- 2.csproj
| |-- 2.sln
|-- Solution3
| |-- 3.cs
| |-- 3.csproj
| |-- 3.sln
Run Code Online (Sandbox Code Playgroud)
所需的git存储库文件结构:
Solution1
|-- .git
|-- 1.cs
|-- 1.csproj
|-- 1.sln
Solution2
|-- .git
|-- 2.cs
|-- 2.csproj
|-- 2.sln …Run Code Online (Sandbox Code Playgroud)