如何在不同存储库中的多个解决方案之间共享源代码库?

2024-02-06

我有一个公共库,我想在几个解决方案之间共享,该库存储在不同的 github 存储库中。我们将共享库放在单独的 GitHub 存储库中并创建了 nuget 包,可以将其安装在每个所需的项目/解决方案中。缺点是更改库中的代码涉及几个步骤(更改代码、推送到库存储库、创建 nuget 包、安装包),这很烦人。

我想用git subtree使用库项目创建子目录,并将其用作我的解决方案中的本地项目,并轻松进行代码更改/测试/调试。 “主要”解决方案的开发人员将有一个选择 - 将库作为二进制 nuget 包或作为子目录中的源项目包含在内。

PROBLEM:当我尝试时git subtree,我发现一个问题:csproj 文件具有对包文件夹的相对引用,当包含在独立库解决方案中和包含在主解决方案中时,这些文件夹位于不同的级别。 在 MyLib.sln 中,路径为 "..\Packages" ,但在 Main.sln 中,路径应为 "..\..\Packages" 。
主 GitHub 存储库(和 OtherUserOfMyLib GitHub 存储库(是))的结构:

Main.sln
LibSubfolder
-----------------| MyLib.sln
-----------------| MyLibSource
--------------------------| myLib.csproj
--------------------------| myLib code
-----------------| (expected Packages from lib solution)
Packages.  (From main solution)

MyLib GitHub 存储库的结构:

MyLib.sln
MyLibSource
--------------| myLib.csproj
--------------| myLib code
Packages.  (From lib solution)

我试过git subtree仅从 Lib 存储库复制 MyLibSource 子目录(这将允许包文件夹的相对位置相同)。不幸的是,我没有找到从另一个存储库复制子目录的方法,该方法支持稍后将更改推回原始存储库。答案使用 git-subtree 添加远程仓库的子目录 https://stackoverflow.com/questions/23937436/add-subdirectory-of-remote-repo-with-git-subtree有几个选项,但所有这些选项似乎都只讨论了单向(拉)同步。 据我所知, git submodule add git subrepo 不支持从源存储库复制子文件夹。

我错过了什么吗?任何人都可以建议,如何从库存储库复制到我的存储库文件夹的子文件夹,这将允许以后双向(拉/推)同步?

我考虑的其他选择是更改包文件夹的位置。但我不确定,选择哪条路径才能使 main.sln 和 MyLib.sln 保持一致。

第三种方法是不要使用 MyLib 存储库中的 MyLib.sln ;仅将存储库用作库源代码的主存储。相反,在主存储库中创建 MyLib.sln 并使用它来构建 NuGet 包。我将能够使用 MyLibSource 项目的 git 子树拉/推内容。 OtherUserOfMyLib 存储库将仅引用子文件夹中的项目,并在需要时调用 git subtree pull/push

Main.sln
MyLib.sln       ( locate in Main repository instead of MyLib repository)
LibSubfolder
-----------------| MyLibSource
--------------------------| myLib.csproj
--------------------------| myLib code
Packages

我的问题是尝试哪种方法:

  • 花时间尝试找到一种方法来推迟创建的 git 子树 子文件夹?
  • 尝试更改包文件夹的位置?
  • 保留在存储库之外构建 nuget 包的解决方案 有包裹(第三种方法)吗?
  • 还要别的吗?

我看过类似的问题在 .NET 解决方案之间共享公共库的最佳实践 https://stackoverflow.com/questions/8879196/best-practice-to-share-common-libraries-between-solutions-in-net and 但没有找到满意的解决方案。


我能够使用 git subtree 将公共存储库(例如源代码库)共享为不同客户端解决方案(存储库)的子文件夹,并允许将更改推回共享存储库。

我们对 C# 库、Powershell psm 模块的文件夹使用类似的方法,考虑用于 React jsx 组件的集合。对于 C# 库,客户端存储库之一构建 NuGet 包,任何喜欢引用 NuGet 包而不是源代码的解决方案都可以使用它。

如果我们需要包含某些开源 github 库的源代码(例如,如果我们希望在新版本可用之前进行更改),我们会使用相同的方法。

在每个应用程序存储库中,我们需要自定义两个批处理文件(针对每个公共存储库):subtreePull 和 subtreePush。

批处理文件示例(基于选项 4使用 git-subtree 添加远程仓库的子目录 https://stackoverflow.com/questions/23937436/add-subdirectory-of-remote-repo-with-git-subtree/30386041#30386041回答) :
CommonLib-子树 Pull.command

@rem Template Pull and Push  are located in SubTreeCommands folder
@Rem from https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree
@set remoteBranch=master
@set RelativeTarget=src/MyApplicationProject/LibSource/MyCommonLib
@echo If you have errors "Working tree has modifications.  Cannot add." uncomment stash before command and stash apply after command
@REM git stash 
@rem run this command from the toplevel of the working tree 
@for /f %%i in ('git rev-parse --show-toplevel ') do set GitRoot=%%i
CD %GitRoot%
IF EXIST %RelativeTarget% (
set gitCmd=pull
) ELSE (
set gitCmd=add  
)
@rem if you want to have full history, do not include  --squash
git subtree %gitCmd%  --prefix %RelativeTarget% https://github.com/MyCompany/MyCommonLib.git %remoteBranch% --squash
@REM git stash apply
@pause

MyCommonLib-SubtreePush.cmd

@Rem from https://medium.com/@v/git-subtrees-a-tutorial-6ff568381844#.a2ne9vlve
set remoteBranch=master
@rem run this command from the toplevel of the working tree 
@for /f %%i in ('git rev-parse --show-toplevel ') do set GitRoot=%%i
CD %GitRoot%
git subtree push --prefix=src/MyApplicationProject/LibSource/MyCommonLib https://github.com/MyCompany/MyCommonLib.git  %remoteBranch%
@pause

在工作期间,您正在对应用程序存储库中的更改进行正常的 git commit/git Push,包括 LibSource 公共库子文件夹中的更改。

要同步您的公共库更改,请运行 subtreePush/subtreePull 命令。
请注意,建议在库发生重大更改后运行 subtreePush(例如,在每个相关项目结束时)。
subtreePull 可能由不同的人在不同的存储库中完成,建议在存储库的主要工作之前运行(例如在项目开始时)。
子树拉取和推送批处理都需要一些时间来运行,但您可以启动它们并执行其他任何操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不同存储库中的多个解决方案之间共享源代码库? 的相关文章

随机推荐

  • 在selenium问题中打开chrome

    我目前正在参加我的第一个自动化测试课程 讲师让我们在加载 Selenium 后在 Eclipse 中创建一个程序 并在程序中创建一个步骤来查看可执行文件以启动 chrome 然后指定一个网站进行检查 看起来我陷入了循环 这是程序 java程
  • 使用 r 删除希伯来语“niqqud”

    一直在努力去除niqqud https en wikipedia org wiki Niqqud 用于表示元音或区分希伯来字母表字母的替代发音的变音符号 例如我有这个变量 样本1 我找不到有效的方法来删除字母下面的标志 尝试过纵梁 与str
  • 从 Web 开发学习 Objective C (Cocoa) 进行 iPhone 编程?

    我想学习开发 iPhone 应用程序 我在 HTML CSS 和 PHP 方面拥有丰富的经验 我也了解一些 JavaScript 我应该从哪里开始 我已经下载了带有 XCode 的 SDK 等等 我是不是有点超前了 我真的不知道 有教程或者
  • 谷歌应用脚​​本,团队驱动的谷歌选择器

    221 5000 你好 目前我正在尝试为谷歌团队驱动器实现谷歌pikker 此代码适用于我的 Google 云端硬盘 但如果您将此代码用于 Google Team Drives 请添加参数 enableFeature google pick
  • 将字符串拆分为行 Oracle SQL

    在搜索论坛后 我想出了以下内容 但它不起作用 我有一张桌子 上面有以下内容 ID Strings 123 abc fgh dwd 243 dfs dfd dfg 353 dfs 424 dfd dfw 523 请注意 大约有 20 000
  • 如何对顺序逻辑进行单元测试?

    假设我有具有以下方法的 Car 类 装载汽油 I燃油气 InsertKey IKey键 启动引擎 IDriverSession Go Car 的目的是配置并返回 IDriverSession 应用程序的其余部分使用该 IDrivingSes
  • 在我的主机上运行 python 脚本

    我是 Web 开发和 Python 的新手 由于我没有足够的词汇来提出确切的问题 这里总结了需要做什么 我有一个小的测试 python cgi 脚本 我已将其上传到 home username pyscripts 位于上面 home 用户名
  • Java 7 中的 emma 和 junit 导致 java.lang.VerifyError 和非法局部变量错误

    所以我收到这些错误 junit 方法 test nz ac massey cs sdc log4jassignment s06005586 AppenderLayoutTest V 中非法局部变量表长度 17 junit java lang
  • JSON.parse() 是如何工作的?

    我没有在 javascript 上做太多工作 而且 我需要解析一个 JSON 字符串 所以 我想知道 JSON parse 到底做了什么 例如 如果我将 json 字符串分配给这样的变量 var ab name abcd details a
  • (为什么)移动构造函数或移动赋值运算符应该清除其参数?

    我正在学习的 C 课程中的移动构造函数实现示例看起来有点像这样 Move constructor Motorcycle Motorcycle Motorcycle ori m wheels std move ori m wheels m s
  • React Native 中的 PhaseScriptExecution [CP-User] 错误

    现在每次我创建一个新项目react native init ProjectName创建后我做npx pod install进而react native run ios它给了我错误 我创建的每个新项目都会发生这种情况 我不确定是否需要进行更新
  • 长赋值和双赋值不是原子的 - 这有什么关系?

    我们知道 long 和 double 赋值在 Java 中不是原子的 除非它们被声明为 volatile 我的问题是它在我们的编程实践中到底有多重要 例如 如果您看到下面的类 其对象在多个线程之间共享 The below class is
  • Facebook向多个朋友“发送”对话

    这个想法是 用户可以请求几个朋友对他们所做的事情提供反馈 我有一个朋友选择器 效果很好 从这里我得到用户 ID 然后我调用发送对话框 结果有多个收件人 而只有一个 有谁知道为什么 FB ui method send name Test to
  • Blazor WebAssembly:同一组件渲染上的多个路由

    我实际上正在试验 Blazor WebAssembly 除了一件事之外 一切都很好 我的想法是我想共享相同的组件来创建或编辑项目 组件的名称是 CreateOrEdit razor 我有两条路线 page master maker crea
  • 单击注销按钮后终止会话并重定向到登录页面

    我在JSP中有以下代码
  • Sass 加载器和 webpack 4

    如何在 webpack 4 中使用 sass 加载器 我读了很多关于这方面的内容 大多数网站建议使用 ExtractTextPlugin 但 ExtractTextPlugin 不适用于 webpack 4 我写了以下内容webpack c
  • 将 IplImage IPL_DEPTH_32S 转换为 QImage Format_RGB32 的最快方法

    将 IplImage IPL DEPTH 32S 转换为 QImage Format RGB32 最快的方法是什么 我需要从摄像头捕捉图片并将其显示在表格上 频率为每秒 30 帧 我尝试使用 QImage 构造函数 QImage qImag
  • jquery触发事件

    我们如何在活动对象上调用触发单击事件 continue live keypress function if e which 32 e which 13 this trigger click 当我按按钮上的 Enter 时 它会进入 if 块
  • Xcode 4.5 + UIScrollView:看不到支柱和弹簧(OSX 10.8 Mountain Lion)

    免责声明 iOS 开发全新 对我轻松一些 在 Xcode 4 5 中遇到了一个有趣的情况 我的尺寸检查器看起来像这样 和我根本看不到支柱和弹簧区域 真正奇怪的部分是 当我点击连接检查器之类的东西时 我确实看到了支柱和弹簧区域 但只看到了一瞬
  • 如何在不同存储库中的多个解决方案之间共享源代码库?

    我有一个公共库 我想在几个解决方案之间共享 该库存储在不同的 github 存储库中 我们将共享库放在单独的 GitHub 存储库中并创建了 nuget 包 可以将其安装在每个所需的项目 解决方案中 缺点是更改库中的代码涉及几个步骤 更改代