我有一个相当大的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,请告诉我.
我正在使用Avery Pennarun的git-subtree,它是git的扩展.
我如何使用git子树从子仓库中挑选一个提交到我的主仓库?另外,在我已经对该前缀进行git子树拉取之后,如何进入子回购历史中的特定提交?
我主要在壁球提交模式下运行它.
是的,所以我的任务是找出GIT是否能解决我们即将出现的问题.(轻松创建功能分支,修补程序分支,错误修复分支,同时保持主干干净,只有功能完成的问题(功能,修补程序,错误修复等).因此,一旦需要完成发布,将不会发布半完成/已提交的问题.
以前我们一直在使用SVN,其中包含git-flow /分支模型的修改版本:http://nvie.com/img/git-model@2x.png git-master是我们的svn-trunk.这是有效的,但对SVN来说有点麻烦.特别是因为我们使用了两个共享存储库.
这就是问题所在.以前我们使用这两个共享存储库作为外部,并且所有外部引用都指向lib/a/branches/develop和lib/b/branches/develop.如果需要功能/修补程序/ bugfix分支,这很麻烦,因为它需要创建三个分支,使用新引用修改超级项目,然后提交所述更改.
经过一些小心的修补,我们转而使用库存储库的分支.(所以,superProject/lib/a是一个分支lib/a/branches/develop)和未来的更新(两种方式)将要求从superProject/lib/ain到合并lib/a/branches/develop或反之亦然.
然而,一旦释放即将到来,这仍然无法解决我们半完成提交的问题.(遗憾的是,在我工作的公司,这可能需要一个小时).所以我们想了一点,并同意开始尝试使用Atlassian提供的工具多一点,从而尝试Bitbucket(之前使用Crucible/FishEye)并使用他们特殊的集成工作流程来git,每个问题的分支都可以创建并完成后,可以创建一个拉取请求,以便我们的发布管理器控制下一个版本中的内容和内容./develop/由于所有问题都将使用所述工作流程完成,因此不再是半生不熟的问题.
我面临的问题是如何合并这些共享项目(库a和b).我一直在阅读网页,发现多个网站都在谈论git-submodules,git-subtree-merge-strategy,git-subtree(脚本)和手动合并(与子树合并相同?).但没有人真正回答我的一些新手问题.到目前为止,我一直对git-subtree最感兴趣,但GUI支持似乎很糟糕.TortoiseGit,SourceTree都没有对git-subtree有一些很好的GUI支持,这需要命令行动作,而且对大多数同事来说,他们不喜欢做命令行事情.
还困扰我的是,没有好的,我能找到的,关于从哪个存储库/分支创建git-subtree的信息,以及来自远程git存储库的克隆不会自动包含正确的远程链接的事实对于任何git子树.因此,如果我不想让我的任何开发人员能够从他们的远程源更新git子树,他们将不得不手动执行git remote add -f libraryXXX http://repohere/lib-xxx.git(一次)然后执行git subtree pull --prefix locationGoesHere libraryXXX master (--squash optional)
这一切看起来都比SVN的工作流程更加繁琐,并且来回合并分支.我错过了什么吗?我读的是过时的信息吗?我只是没有看到使用共享存储库的正确方法?
我使用的一些资源:
正在搜索扔SO以获得答案.碰到这个老线程似乎没有给出任何答案.重新触发这个线程,希望有人知道!
有人能告诉我b/w git子树和git filter-branch的区别吗?我将在原始问题中使用相同的示例:
git subtree split --prefix=some_subdir -b some_branch
git filter-branch --subdirectory-filter some_subdir some_branch
Run Code Online (Sandbox Code Playgroud) 我有一个目录/amp中RepoA和RepoB(与/放大器的内容填充最初).我想将/ampRepoA中的任何更改镜像 到RepoB.
可能吗 ?
PS:RepoA包含许多其他目录.我只想镜像/ amp dir.而RepoB只会有/ amp内容而不是其他内容.
我在 Github 上有一个 git 仓库,看起来像这样:
.git/
assets/
tools/
a.sh
b.sh
c.sh
Run Code Online (Sandbox Code Playgroud)
当然 .git 文件夹不在版本控制中,但您明白了。我想将 tools/*.sh 复制到本地目录,路径如下:
./scripts/git/tools
Run Code Online (Sandbox Code Playgroud)
我当前的目录是一个 git 存储库,它与远程 git 存储库共享完全不同的历史记录,我只想从远程复制一些文件,我不想合并任何内容。
我想我可以做这样的事情:
git clone --path assets/tools/*.sh "$remote_repo" ./scripts/git/tools
Run Code Online (Sandbox Code Playgroud)
但该命令不是真实的,我可以使用一些命令来执行此操作吗?
我能想到的唯一其他方法是将整个存储库克隆到某个临时目录,然后复制文件,但这并不是那么有趣。
我只是在寻找一种可能性来授予另一位开发人员访问我的 git 存储库中的一个文件的权限。除了子模块/子树之外还有什么方法吗?
这只是应该由其他人翻译的本地化文件。
期待您的回复!
谢谢!
塞巴斯蒂安
我有 GIT 子树的问题。
让我们看看,我有一个项目 A,其中包括:
Project A
|_CodeFolder1
|_CodeFolder2
|_SharedFolder1
|_SharedFolder2
Run Code Online (Sandbox Code Playgroud)
假设我创建了一个只有SharedFolder1和SharedFolder2的新存储库。所以我从主存储库中删除了这两个文件夹,并将它们添加到新的共享存储库中,如下所示:
SharedProject
|_SharedFolder1
|_SharedFolder2
Run Code Online (Sandbox Code Playgroud)
我是子树的新手,但到目前为止我实现了从远程子树拉/推。但是我遇到了问题。添加子树时,必须添加前缀,但我不想将共享代码保存在不同的文件夹中,例如:
Project A
|_CodeFolder1
|_CodeFolder2
|_SharedFolders
|_SharedFolder1
|_SharedFolder2
Run Code Online (Sandbox Code Playgroud)
--prefix每当我尝试添加子树时,这就是什么:
git subtree add --prefix=SharedFolders --squash shared master
Run Code Online (Sandbox Code Playgroud)
有什么办法可以告诉 git 没有前缀,或者子树必须直接保存在 ProjectA 中,就像在第一个模式中一样,而无需为子树创建新文件夹?
我试过这个命令
git subtree add --prefix=/ --squash shared master
Run Code Online (Sandbox Code Playgroud)
但总是有错误。似乎子树不允许我将树中的文件夹直接带到我的工作路径而不为共享文件创建新文件夹。
任何帮助将非常感激。
我一直在关注这个优秀的答案,将我的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)
也就是说,保留原始目录结构,但丢弃命令行中未明确提及的所有内容.
我怎样才能做到这一点?
是否有任何理由使用包管理器而不是git子模块/子树,反之亦然?git解决方案似乎比简单的包管理器麻烦得多.
假设git子模块的节省空间的好处并不重要.
更新:有人在这个问题上添加了一个C++标签,但我已经删除了它.这个问题与C++没有特别的关系.欢迎提供比接受的答案更一般的答案.
git-subtree ×10
git ×9
github ×3
cherry-pick ×1
git-clone ×1
svn ×1
tortoisegit ×1
translation ×1