我有一个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存储库克隆后(在更好的代码中)我做了一些更改,提交并尝试推送:
git push origin master
Run Code Online (Sandbox Code Playgroud)
错误:
错误:无法锁定现有信息/引用
致命错误:git-http-push失败
此案例涉及已存在的存储库.
我以前做过的是:
git config –global http.sslVerify falsegit initgit remote add [url] git clonegit commit在'bettercodes'我无法访问git log.
我正在使用Windows.详细错误是:
C:\MyWorkStuff\Projects\Ruby\MyProject\>git push origin master
Unable to create branch path https://user:password@git.bettercodes.org/myproject/info/
error: cannot lock existing info/refs
fatal: git-http-push failed
Run Code Online (Sandbox Code Playgroud)
我之前克隆过,然后更改了代码并提交了.
我已经清理了我们的Git存储库,我们需要从历史中删除大部分内容.我这样做使用:
git filter-branch --prune-empty --tree-filter 'rm -rf some_stuff'
Run Code Online (Sandbox Code Playgroud)
--prune-empty除了提交多个父项(合并提交)之外,该标志将删除在该过程之后保留为空的提交.即使合并的分支完全没有包含任何内容,合并也不会向树添加任何内容.
我如何从历史中修剪这些空的合并提交?
可能重复:
如何在保留子目录的同时拆分git存储库?
有一次,我将我的代码添加到现有的git repo中,并且已经承诺了很多,因为其他开发人员已经提交到repo中的其他现有文件. 现在我想将我的代码拆分为自己的repo,但保留我的特定文件的所有更改历史记录.
通过阅读其他人为分割代码所做的工作,我正在查看filter-branch和执行--index-filter或--tree-filter使用rm命令来查找我不关心的文件.我不想使用,--subdirectory-filter因为它不适合将我的代码保存为topdir的子目录(我们也共享一个子目录).更复杂的是,原始存储库中的一些文件随着时间的推移已经移动了一些,并且有一些文件被创建然后被删除.这使得设计一个rm列表有点......具有挑战性.
我正在寻找一种方法来过滤所有/除了/文件/目录列表.有人知道这样做的方法吗?
我目前包含顶级子文件夹,比如多个项目一个很大的仓库/a,/b,/c,和/d.
现在我想将该存储库拆分为两个不同的存储库:一个包含/a和/b另一个包含/c和/d.
我知道git filter-branch --subdirectory-filter,这对于提取单个目录是完美的,但它似乎无法一次提取多个目录.
我也知道git filter-branch --prune-empty --tree-filter,这将允许我删除所有内容,但两个想要的目录.这感觉不完全正确,因为我必须手动指定可能存在的所有顶级目录.
有没有更好的方法从大型存储库中提取两个目录?
PS:当然,使用其他东西的任何好的解决方案git filter-branch都很好.;)
我想要的是这个问题.但是,我希望拆分为单独仓库的目录仍然是该仓库中的子目录:
我有这个:
foo/
.git/
bar/
baz/
qux/
Run Code Online (Sandbox Code Playgroud)
我想将它拆分为两个完全独立的存储库:
foo/
.git/
bar/
baz/
quux/
.git/
qux/ # Note: still a subdirectory
Run Code Online (Sandbox Code Playgroud)
如何在git中执行此操作?
如果有一些方法可以将所有新repo的内容移动到历史记录中的子目录中,我可以使用此答案中的方法.
我有一个相当大的git存储库,它有一个我维护库代码的目录.该目录包含许多子目录.
repo
+--- lib
| +--- A
| +--- B
...
| +--- Z
Run Code Online (Sandbox Code Playgroud)
现在让我们假设我想要打开源子目录A,...,M并保持子目录的N,...,Z源代码.我们还假设我想:
A,...,M在一个开源存储库中.原因是这些目录A,...,M具有相互依赖性,将它们分成单独的存储库会很困惑.lib/pub和lib/pvt,但这将有级联需要改变其他地方引用效应或将需要大量的符号链接(lib/A -> lib/pub/A).git subtree我可以在我的封闭源代码库或开源代码库中修改代码的解决方案,我可以轻松地同步两个存储库之间的更改.我已经在stackoverflow和google中搜索了一个解决方案,但似乎没有明显的解决方案.从概念上讲,这是git subtree应该能够做到的事情,但它只适用于单个子目录.
我已经查看了git-subtree脚本,目的是修改它.
https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh
在我看来,如果我要修改,subtree_for_commit()我应该能够说服git subtree split考虑不止一个目录进行拆分.但是我对git的了解还不足以理解脚本正在做什么并在不破坏事情的情况下修改它.
如果您对上述问题或任何其他修改指针有任何解决方案git-subtree,请告诉我.
我一直在关注这个优秀的答案,将我的git存储库的子目录提取到自己的存储库中,同时保留完整的历史记录.
我的存储库看起来像:
src/
http/
math/
tests/
http/
math/
Run Code Online (Sandbox Code Playgroud)
我想创建一个只包含src/math和tests/math目录的新分支 .
如果我运行以下命令:
git subtree split -P src/math -b math
Run Code Online (Sandbox Code Playgroud)
它创建一个包含目录内容的分支src/math,但丢弃该src/math/前缀.
如果我尝试使用两个目录的相同命令:
git subtree split -P src/math -P tests/math -b math
Run Code Online (Sandbox Code Playgroud)
它只提取tests/math,忽略src/math和丢弃tests/math前缀的内容.
总而言之,我希望我的最终存储库看起来像:
src/
math/
tests/
math/
Run Code Online (Sandbox Code Playgroud)
也就是说,保留原始目录结构,但丢弃命令行中未明确提及的所有内容.
我怎样才能做到这一点?
这个问题与以下内容有关:
我想分离一对,而不是分离一个子目录.例如,这是我的文件夹结构:
/app1
/file1
/file2
/folder1
/folder2
/app2
/file3
/file4
/folder3
/folder4
/test
/file5
/file6
/folder5
/folder6
/README.md
/new_file
Run Code Online (Sandbox Code Playgroud)
而我想这样做:
/app1
/file1
/file2
/folder1
/folder2
/app2
/file3
/file4
/folder3
/folder4
Run Code Online (Sandbox Code Playgroud)
我尝试了以下替代方案,到目前为止还没有工作:
git filter-branch --index-filter 'git rm --cached -qr -- . && git reset -q $GIT_COMMIT -- /app1/* app2/*' --prune-empty -- --all
Error:
pathspec '.' did not match any files
Run Code Online (Sandbox Code Playgroud)
第二次尝试:
git filter-branch --tree-filter "mkdir samples; mv app1 app2 samples/" HEAD
Error:
rename app1 to …Run Code Online (Sandbox Code Playgroud)