所以我对 git 有点陌生——或者至少是控制台上的 git,一直在使用 Tortoise git。而且我发现自己处于一个我认为相对“常见”的用例中:
我计划了几个存储库:通用/共享代码 repo_sN,应用程序代码 repo_appN。
某些共享存储库的文件夹结构应如下所示:
repo_s0
+---folder_s0_0
| file.txt
|
\---folder_s0_1
file.txt
应用程序存储库的文件夹结构可能使用多个共享存储库:
repo_app0
+---folder_s0_0
| file.txt
|
+---folder_s0_1
| file.txt
|
+---folder_s1_0
| file.txt
|
\---folder_s1_1
file.txt
现在,我希望将上述 repo_app0 文件夹结构提交给 remote_repo_app0,即包括所有共享子目录的内容。我还希望能够将我在任何 folder_sN_N 中所做的更改推送回其正确的存储库 repo_sN/从所述存储库中提取更新。
然而,出现了两个问题。使用 git-subtree,我只能让事情像这样工作:
git subtree add --prefix=s0 remote_repo_s0 master
这给了我
repo_app0
+---s0
| +---folder_s0_0
| | file.txt
| |
| \---folder_s0_1
| file.txt
|
\---s1
+---folder_s1_0
| file.txt
|
\---folder_s1_1
file.txt
这是不可取的,因为它不会隐藏子存储库已被使用的事实,并且会不必要地弄乱我的源目录并违反我工作场所的默认文件夹结构。
我将提交推回 repo_app0 使用
git commit -m "My commit"
git push remote_repo_app0 master
git subtree push --prefix=s1 remote_repo_s1 master
但是,这也会推动文件夹 sN 中所做的更改,这也排除了所有 folder_sN_N 的公共顶级目录:-/。
其次,例如,我可能需要将 repo_s0 的分支从“master”切换到“compatibility”,以便使用较旧的编译器编译 app0。所以想法是功能不会改变,而实现确实符合旧的语言语法。
我一直无法找出如何使用像“常规” git 工作目录这样的子树并切换分支。
那么这可能吗?这是一个非常深奥的用例,所有人都只是手动符号链接/复制/???需要的零件?更重要的是,这里有我缺少的解决方案吗?