我在一个大型回购团队工作.最近我们决定将其中一个文件夹移动到自己的子模块中
-- aaa
-- .git
-- bbb
-- ccc
-- www # this folder is going into its own repo.
Run Code Online (Sandbox Code Playgroud)
我按照说明将www文件夹过滤到这里列出的自己的repo:Detach(move)子目录到单独的Git存储库中.我把www文件夹移出了aaa回购.
我通过运行以下命令从主分支中删除了该目录:
$ cd aaa
$ git checkout master
$ git rm -rf www
$ git commit -m "remove the www/ folder from the aaa repo."
Run Code Online (Sandbox Code Playgroud)
所以现在在master上,树看起来像这样:
-- aaa
-- .git
-- bbb
-- ccc
Run Code Online (Sandbox Code Playgroud)
我想www通过运行添加为子模块:
$ cd aaa
$ git checkout master
$ git submodule add git@bitbucket.org:kevinburke/www.git www
Cloning …Run Code Online (Sandbox Code Playgroud) 我将一个git repo分成3个.我使用Detach(move)子目录到单独的Git存储库中来分隔文件夹并将它们成功推送到新的git repos.在现有的 repo上,我使用了以下命令来清除移动的目录.
git filter-branch -f --index-filter "git rm -q -r -f --cached --ignore-unmatch lib/xxx/$REPO" --prune-empty HEAD
Run Code Online (Sandbox Code Playgroud)
现在当我做git st原始回购时,我得到:
# On branch 1.5.0
nothing to commit (working directory clean)
Run Code Online (Sandbox Code Playgroud)
当我尝试时git push,我得到:
! [rejected] 1.5.0 -> 1.5.0 (non-fast-forward)
error: failed to push some refs to 'git@github.com:/xxx/.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again. See the
'Note about fast-forwards' section of …Run Code Online (Sandbox Code Playgroud) 我按照本教程将SVN存储库转换为Git .现在似乎无法提取此答案中建议的子存储库.
原谅长篇文章,但大部分文本都是格式良好的git输出.
操作系统:Windows 8命令行:MinGW Git版本:1.8.1.msysgit.1
除非您有一个干净的暂存区域且没有修改过的文件,否则提取子存储库的过程似乎不起作用.
git status告诉我,我有一个修改过的文件,即使这是一个新的SVN导入.好吧,让我们试着摆脱它.
尝试并还原文件.
user$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: folder with space/folder/toolbar.png
#
no changes added to commit (use "git add" and/or "git commit -a")
user$ git checkout -- "folder with space/folder/toolbar.png"
user$ git status …Run Code Online (Sandbox Code Playgroud) 我有一个包含几个模块的git存储库,每个模块都在自己的子文件夹中,我想将它们拆分成独立的存储库,理想情况下尽可能多地保留它们各自的历史记录.这样做有规范的方法吗?
我想从已经存在的repo的子文件夹创建一个单独的repo.
将(移动)子目录分离到单独的Git存储库中就可以显示出来.但是,我无法用它获得一个干净的回购.我最终遇到了新回购的两个问题:
这是我做的:
$ git clone ssh://.../repo.git
$ cd repo
$ git filter-branch --subdirectory-filter subdirectory HEAD -- --all
$ git reset --hard
$ git gc --aggressive
$ git prune
Run Code Online (Sandbox Code Playgroud)
在此之后,我似乎拥有了回购和新历史的原始历史.我输入"git log --all --graph"(或gitk --all)我看到,作为第一个提交,第一个repo的初始提交.然后,图表显示原始repo的完整历史记录,直到最后一次提交.然后,我在第一个上面有一个SECOND历史,显示了我想要的子文件夹的历史.但在历史的那一部分,我只有"主人",没有分支/合并.
"git log",gitk或gitg都只显示"flatten"历史记录:它们不会在子文件夹的展平历史之前显示初始回购的历史记录.
我尝试使用"filter-branch"命令,克隆生成的repo(使用--no-hardlinks),使用:
$ git filter-branch --subdirectory-filter subdirectory -- --all
Run Code Online (Sandbox Code Playgroud)
代替:
$ git filter-branch --subdirectory-filter subdirectory HEAD -- --all
Run Code Online (Sandbox Code Playgroud)
但结果相同.
我做错了什么或者git坏了吗?我真的没有想法......使用git 1.7.6.谢谢.
编辑:我认为问题可能来自于filter-branch忽略了merge提交的事实,因此给出了没有分支或合并的平面历史记录......
假设您拥有存储库:
myCode/megaProject/moduleA
myCode/megaProject/moduleB
Run Code Online (Sandbox Code Playgroud)
随着时间的推移(月),您重新组织项目.重构代码以使模块独立.megaProject目录中的文件将移动到它们自己的目录中.强调移动 - 保留这些文件的历史.
myCode/megaProject
myCode/moduleA
myCode/moduleB
Run Code Online (Sandbox Code Playgroud)
现在您希望将这些模块移动到他们自己的GIT仓库中.只留下megaProject的原件.
myCode/megaProject
newRepoA/moduleA
newRepoB/moduleB
Run Code Online (Sandbox Code Playgroud)
记录该filter-branch命令是为了执行此操作,但是当文件移出目标目录之外时,它不会跟踪历史记录.因此,历史记录从文件移动到新目录开始,而不是文件的历史,然后它们存在于旧的megaProject目录中.
如何基于目标目录拆分GIT历史记录,并遵循此路径之外的历史记录 - 只保留与这些文件相关的提交历史记录而不是其他内容?
关于SO的众多其他答案主要集中在拆分回购 - 但没有提及拆分和跟随移动历史.
更新:我试图简化这里的真实示例以清楚地解释我的选项,但这并没有真正起作用.到目前为止,下面的链接示例过于笼统,甚至无法使用这个简单的示例.
我能够一直用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) 我有一个用git管理的django项目.我是git把它推给我的主人.现在,我希望能够将其中一个目录(包括所有子目录)推送到另一个git仓库.如果可能的话,怎么可能呢?
编辑:所以我希望该目录本身就是一个git repo.
我想在我的仓库中创建一个新的分支,它只包含来自master中特定目录的文件及其历史记录,然后将该分支推送到新的存储库.
...或类似的东西 - 例如,可以将目录推送到新的存储库到新的存储库而无需创建分支.
到目前为止,我认为以下内容可行,但我想知道是否有更简化的方法.
1 - 创建一个空分支:
git symbolic-ref HEAD refs/heads/<new-branch>
rm .git/index
git clean -fdx
Run Code Online (Sandbox Code Playgroud)
2 - 从主服务器中检出目录:
git checkout master <paths> ...
git add <paths> ...
git commit
Run Code Online (Sandbox Code Playgroud)
3 - 将分支推送到新远程:
git push -u <remote-URL> <new-branch>
Run Code Online (Sandbox Code Playgroud)
4 - 然后,在新的repo中,与master合并分支:
git checkout -t origin/<new-branch>
git checkout master
git merge <new-branch>
git branch -d afterimage
git branch -d -r afterimage
Run Code Online (Sandbox Code Playgroud)
我正在尝试将与Detach子目录等效的东西放到单独的Git存储库中,但没有git filter-branch乱七八糟的东西.
我需要将我的git repo分成两部分.我使用了这里显示的步骤:Detach(move)子目录到单独的Git存储库中
我使用的命令是:
git filter-branch --subdirectory-filter ABC HEAD -- --all
Run Code Online (Sandbox Code Playgroud)
这似乎很好,并留下了ABC作为根.
但是现在,如果我尝试检查在拆分回购之前存在的标记:
git checkout an-old-tagname
Run Code Online (Sandbox Code Playgroud)
它正在重新创建旧的目录结构 - 所以重新创建ABC作为子目录,以及XYZ1和XYZ2.
我知道回购真正看到了那个时间点 - 但我希望标签只引用ABC位,好像它们当时已经在根部.我认为这是filter-branch在重写历史时所做的事情,但显然我并没有正确地理解它.
如何重新编写标签,以便我可以回到过去,同时仍然将ABC作为回购的根源?