我们假设有两个git存储库,其中包含一些文件:
ProjectA
+ a
+ b
ProjectB
+ foo/x
+ foo/y
+ bar/z
Run Code Online (Sandbox Code Playgroud)
现在,我想包括目录foo从项目B为项目A.
至于我,当我明白git subtree add的prefix是,它应该在接收库的路径,所以当我做
git subtree add --prefix=project_b --squash URL_of_ProjectB
Run Code Online (Sandbox Code Playgroud)
我最终会
ProjectA
+ a
+ b
+ project_b
+ foo/x
+ foo/y
+ bar/z
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式指定我只想foo获取此布局吗?
ProjectA
+ a
+ b
+ project_b
+ x
+ y
Run Code Online (Sandbox Code Playgroud) 我必须从非主分支部署一个git子目录.我看过这个答案和关于Heroku的文档,但是当我发布时
git subtree push --prefix visualizations heroku develop:master
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
error: src refspec d02911f4e410256fae0760f87f186289436ff98b:refs/heads/develop does not match any
Run Code Online (Sandbox Code Playgroud)
我真的不知道该怎么办.
我有一个存储库,其中包含不再使用的旧版网站的代码master.该站点在一个新的存储库中完全重新设计,该存储库中的代码和历史记录被复制到旧站点的repo中的一个分支中,让我们调用它new_site.我无法合并new_site到master,因为历史是完全不同的.
我已经调查过两个子模块和子树合并了一下,但是当你试图保持代码来自另一个项目的子目录中包含的一个项目时,两者似乎只是相关的,而不是当你想要在两个工作树之上粘贴两个工作树时彼此.
此时,我希望将旧代码保留在原来的位置,并将其添加new_site到当前HEAD的顶部.任何想法我怎么能做到这一点,或替代建议清理这个烂摊子而不吹走旧代码?
我发现了几个使用filter-branch和subtree的简单例子,但它们总是只移动1个目录.我想采取以下回购:
/
Project1.sln
Project2.sln
Source/
CommonLib.Data/
CommonLib.Web/
Project1.Data/
Project1.Web/
Project1.Other/
Project2.Data/
Project2.Web/
Run Code Online (Sandbox Code Playgroud)
并将事物移到他们自己的回购中,具有以下结构:
# CommonRepo
/
CommonLib.Data/
CommonLib.Web/
# Project1Repo
/
Project1.sln
Project1.Data/
Project1.Web/
Project1.Other/
# Project2Repo
/
Project2.sln
Project2.Data/
Project2.Web/
Run Code Online (Sandbox Code Playgroud)
同时保持整个历史.更复杂的是,原始仓库的一个或多个分支对应于每个项目,因此所引用的其他项目的CommonLib版本可能略有不同.
我想使用git子树添加在正确的标签/版本的每个新repos中添加一个返回CommonLib的引用,但首先我需要一种方法将一些目录一次性拆分到它们自己的位置.
git子树拆分-P似乎只想要一个目录,而且我也无法获得filter-branch来获取倍数.我在一个Windows框上,所以没有设置所有的脚本细节,以使这更容易.
有什么建议?
我已经为我的项目添加了另一个repo git subtree add,现在当我从子树项目更新我的主项目时git subtree pull --prefix=subtree-dir subtree-origin subtree-branch --squash,我最终在我的主历史中有两个新的提交,前者说"Squashed"子树 - dir /'从618c8ff..822004d更改",后者是引用前者的合并提交.
这感觉很糟糕.
我理解压缩提交是必要的(或者是子树项目的所有干预提交),但有没有办法避免第二次合并提交?我很想发现一种行为很像的模式git pull --rebase.
万一你今天没有听过,你太棒了.
我正在尝试在我的设置仓库中添加一个vim插件作为git子树.无论我在哪里尝试将子树拉到,git都会回复error: pathspec
我在repos根目录下使用下面的命令:
git subtree add --prefix .vim/bundle/powerline powerline master --squash
Run Code Online (Sandbox Code Playgroud)
这导致输出:
git fetch powerline master
From git://github.com/Lokaltog/powerline
* branch master -> FETCH_HEAD
error: pathspec '.vim/bundle/powerline' did not match any file(s) known to git.
Run Code Online (Sandbox Code Playgroud)
我正在使用git版本2.0.3
我添加了一个子树
git subtree add --prefix=path/to/example --squash git@github.com:johndoe/example.git master
Run Code Online (Sandbox Code Playgroud)
并想要删除它.没有git subtree rm命令.我已经删除了所有文件path/to/example,但path/to/example仍出现在我列出的子树通过
git log | grep git-subtree-dir | awk '{ print $2 }'
Run Code Online (Sandbox Code Playgroud)
如何从git中删除子树引用,使其无法再被推/拉/等?
我一直在寻找一个项目的git子树,其中有多个开发人员,多个存储库在运行.我使用的是sourcetree,我能够从其他存储库中为我的工作副本添加子树,并能够将这些更改推送到远程副本.一切都在我的工作正常,我能够看到sourcetree中列出的子树,有选择地推送更新到子树,从中获取更新等.
主要问题是,当另一个开发人员从远程检出主要工作副本时,所有子树被绑定为目录,他们无法在任何地方看到子树信息.我的意思是sourcetree没有显示我的系统中添加的子树,整个项目显示为一个巨大的存储库而不是一个具有多个子树的存储库.子树信息在哪里?
git是否仅限于本地,或者我在git子树上缺少一些重要的东西?
我也尝试使用终端而不是sourcetree添加子树,但即便如此,我也无法在任何地方看到子树信息.
我在git上添加了一个似乎正在工作的子树.我进入目录并进行了一些更改然后推送.
我注意到这些更改显示在父项目中,但我用作源的存储库尚未更新.
我试过git subtree push哪个返回:
您必须提供--prefix选项.
还git subtree push --prefix=my/folder git@mygitrepo.com返回:
你必须提供
<repository> <ref>
将更改推送到我的git子树的原始仓库的正确方法是什么?
编辑:有人建议我这样做:
git subtree push --prefix=my/folder origin master
Run Code Online (Sandbox Code Playgroud)
当我运行上面的程序时,它会启动进程,但最终会说分支落后了.所以我跑:
git subtree pull --prefix=my/folder origin master
Run Code Online (Sandbox Code Playgroud)
返回"已经是最新的"
显然,添加具有子模块的存储库的子树将破坏git submodule init。这是一个重现该问题的脚本:
#!/bin/sh
set -ex
mkdir submod
cd submod
git init
touch foo
git add foo
git commit -asm "This is a submodule"
cd ..
mkdir subtree
cd subtree
git init
git submodule add `realpath ../submod` submod
git commit -asm "This has reference to submodule"
cd ..
mkdir top
cd top
git init
touch bar
git add bar
git commit -asm "Dummy commit so HEAD resolves correctly"
git subtree add --prefix=subtree `realpath ../subtree` master
# This fails! …Run Code Online (Sandbox Code Playgroud)