目录
1. 问题
我遇到的问题是我想在GitHub上发布我的一篇文章的源代码,以便用户可以轻松下载它。问题是一篇文章的源代码由四个Visual Studio C#解决方案组成。我不想将解决方案合并为一个,这也不是明智的,因为多个VS解决方案包含一个同名的项目,这就是我在文章中解释的代码演变。我希望用户在“一个克隆”中轻松获取文章的整个源代码。这是我的文件夹结构:
我打开VS2022,但我被卡住了。VS2022意味着Git存储库是每个VS解决方案。我有多个VS C#解决方案,我想将它们打包到一个存储库中。现在怎么办?
2. 检查技术:Git子模块或Git子树
有一段时间,我认为像子模块或子树这样的Git技术会有所帮助。但是,在仔细检查它们之后,它们并不是为了这个目的。我不想共享库代码,而是想一次性从GitHub获取所有内容。我不认为您可以在Git中创建包含多个存储库的“工作场所”,并从“git克隆”的角度来看将它们视为一个存储库。
3. 解决方案——在SourceTree中创建单个存储库
我发现我能做的最好的事情就是在更高的杠杆目录上创建Git存储库,其中包含我拥有的所有四个解决方案。这样,我将在一个Git存储库中获得四个解决方案。我立即知道,我将在每个存储库而不是每个VS解决方案中拥有分支。
3.1. 创建仓库
我在VS2022中检查了Git选项,发现它们是有限的,所以我需要另一个Git工具。我决定使用Sourcetree创建一个高级目录存储库。
还不要承诺任何东西!我们需要先设置 .gitignore 文件。如果您不先设置 .gitignore 文件,则所有项目文件(如二进制文件和中间构建文件)都将签入到存储库中,我们不希望这样做。
3.2. 设置.gitignore
为了模拟VS2022的工作,我将VS2022生成的两个文件(在其他C#项目中创建的文件.gitignore和.gitattributes )复制到我的存储库的根目录中并签入它们。
我们手动执行此操作是因为我们没有使用VS2022来创建Git存储库,在这种情况下,VS2022将根据您选择的项目类型自动创建 .gitignore 。由于我们接管了SourceTree自己创建存储库的责任,因此我们有责任创建正确的.gitignore 文件。
3.3. 签入C# VS解决方案文件
然后,我将所有Visual Studio解决方案文件提交到存储库中。因为设置了.gitignore ,所以提交将忽略二进制文件等。
3.4. 创建GitHub仓库
然后,我在GitHub上创建了我的远程仓库帐户并推送了文件。
您可以在远程端浏览存储库,并验证存储库中是否未签入任何二进制文件或其他项目文件。如果确实发生这种情况,则您的 .gitignore 文件有问题。
3.5. 合并不可合并的分支
我现在遇到的问题,刚刚发生,但我相信会再次发生在我和其他人身上,是我完成了两个分支:主要分支和主分支。默认情况下,“main”分支由GitHub创建,那里有一个自述文件。分支“master”默认由SourceTree创建,我的代码(我的四个VS解决方案)在其中。
好的,这里不需要有两个分支,让我们合并它们并摆脱其中一个。让我们保留 GitHub 默认分支“main”并删除“master”。
但是当您尝试合并这两个分支时会出现一个问题:
它给出了一个错误:“致命:拒绝合并不相关的历史”。
由于我们的两个分支没有共同的祖先提交,SourceTree认为我们做错了什么。但我们知道我们是对的,并且想要强迫它。
我看了看,它在[1]中说您无法从SourceTree GUI中解决这个问题。所以,我们需要GitBash来运行命令行Git命令。问题的说明和说明在 [2] 中。
我们需要运行“git merge <branch-name> --allow-unrelated-histories”
因此,您可以从SourceTree(终端按钮)打开GitBash,然后执行命令。系统将提示您在单独的文本编辑器中输入提交注释。然后合并将继续。
以下是合并分支现在的样子:
将更改推送到GitHub并验证“main”分支现在是否包含所有文件:
3.6. 删除不需要的分支
现在,您可以在SourceTree中本地删除“master”分支,也可以在GitHub上远程删除。这是它现在的样子。分支历史记录被保留,但没有分支“master”:
4. VS2022中的验证解决方案
现在是时候看看VS2022方面的情况了。首先,我们得到克隆URL:
然后,我们在VS2022中克隆存储库。
这是我们得到的。我们同时得到了所有四种解决方案。
通过单击某些解决方案,我们转到它:
通过单击上面的按钮,我们可以返回所有四种解决方案的视图。
这就是我们想要的。唯一的问题是所有四个解决方案都在同一个分支上,即“main”分支。您可能能做的最好的事情是为每个解决方案创建一个单独的分支并检查那里的代码更改。
5. 结论
我的大多数项目都在TFS中,所以我惊讶于强大的VS2022很容易被将多个解决方案放入单个Git存储库的简单想法所击败。如果没有像SourceTree或命令行GitBash这样的外部工具,就不可能做到这一点。
关于Git,我在想,它不是一个开源项目吗?是否可以对其进行升级,使其具有包含多个Git存储库的工作区的概念?这将使我们免于现在在同一分支上拥有所有四种解决方案的恶劣局面。与Git社区的正确链接似乎是[3]、[4] ...对于那些有时间的人。
6. 参考资料
- [1] Sourcetree error when trying to pull from reposito...
- [2] Git refusing to merge unrelated histories on rebase - Stack Overflow
- [3] GitCommunity - Git SCM Wiki
- [4] https://github.blog/2022-04-18-highlights-from-git-2-36/
https://www.codeproject.com/Articles/5339681/Git-Multiple-Visual-Studio-Solutions-in-a-Single-G