【发布时间】:2018-07-27 00:27:54
【问题描述】:
我在寻找什么:
我正在寻找一种方法来在项目 repo 中拥有一个文件或(更好)一个目录,它是 repo 的一部分(跟踪),但通过切换分支保持不变。
另外,要知道我并不反对考虑 Git 以外的其他东西。这正是我所习惯的。
用例:
我有一个个人项目,我想将 git 的魔力应用到其中。到目前为止有一个问题。
我有一个不属于实际代码的文件。它不适用于生产。它存在的唯一目的是让我有一个地方可以在我遇到想法时写下想法,或者在我遇到困难时进行头脑风暴。我通常会与我正在做的任何其他事情同时进行编辑,并且有时会保持打开状态。我在做什么并不重要,它是同一个文件,其内容与我所在的分支无关。
我不希望在切换分支时更改此文件。对我来说,这种浮动文件是项目的一部分,可以使用版本控制。但是,它并没有真正以编码方式连接到其余文件,所以当我签出一些文件时,这个浮动文件不应该改变,但是当我提交时,我希望计划文件也被提交,但不是那么多到一个分支,但到回购。这当然没有意义,因为 Git 不是那样工作的,但这并不意味着我不能做一些提供类似结果的事情。
简而言之。 . .
我有一些文件是项目的一部分,但存在于正常结构之外。我希望跟踪这些文件,但在我切换分支时保持不变,或者在所有分支上始终以相同的形式存在。
注意事项
- 我是唯一一个提交(甚至正在查看)的人。
- 我有两台机器将在处理此问题时使用。
- 当我将 repo 推送到远程时,我希望推送所有内容。
- 相关文件未与其他项目共享(正常使用子树和子模块)。
- 除非存在不可避免的技术限制,否则我认为遥控器不会超过一个(用于项目的那个)。
- 这些文件本身不需要任何类型的多分支方案(该文件的所有提交都存在于同一分支上或同时存在于所有分支上)。
可能(但被拒绝)的解决方案:
工作树
我搜索的第一件事是导致工作树的“分支特定排除”。这可以通过per worktree exclusion 来完成。我想我能做的是有一个工作树 ../planning/ ,将其设置为排除除 ../planning/planning/ 的内容之外的所有内容(在主树中以 ./planning/ 的形式存在)。在主树中,然后我在计划分支中合并。
这里的问题是目录结构很奇怪,文件是不必要的冗余。此外,我可以预见合并会出错并弄乱项目中的其余文件。
我脑海中还有一个小声音告诉我,我忽略了一些重大缺陷。
子模块
考虑忽略的事物和重大缺陷。 . .submodules(这似乎是 git 中最受诟病的一个特性)。
接下来我遇到的是一个子模块。这是在我搜索“子项目”时,它就像另一个仓库中的独立仓库。然后我开始阅读它们。就我而言,主要问题是他们似乎需要自己的遥控器(不想要这个),除非你时刻保持警惕,否则你很容易把事情搞砸,有时是默默无闻。错误是坏的;无声错误更糟糕。
即使我愿意希望自己不会搞砸,但当你有一个单独的上游时,子模块似乎很有用,这正是我不想要的那种东西。当然,如果这是需要做的。 . .就这样吧。
子树
除非我遗漏了什么,否则在我的例子中,我看不到使用子树将 repo 符号链接到子目录的任何优势。
在我看来,子树在“超级树”中的作用不如子模块。
但是,由于这只是一个 bash 脚本,我似乎可以制作这样的工作,而不需要单独的遥控器。
使用孤立的分支
在搜索“一个 repo 几个项目”时,我发现了一个关于该主题的 Stack Overflow 问题(不是我的,而是我搜索的)。 best/first answer was about orphaned branches。这看起来很有希望,因为它与我脑海中的最接近——一个与主干分开的分支。问题是我不能同时处理规划文件(始终打开)和实际项目中需要处理的任何文件。
Gitslave/元
一开始我以为无论是 Gitslave(不再是)还是 Meta,在了解了它们之后都能做我想做的事,但事实并非如此。他们似乎对超级/元存储库中的每个存储库执行相同的操作。如果我有两个 repo,那么用于计划的一个将具有极其简单的分支结构;我在计划 repo 中的哪个分支不应该根据我在主 repo 中的内容而改变。
只要有一个单独的仓库
虽然这将完成我想要的部分内容,但它与所声明的文件是项目 repo 的一部分的要求背道而驰。这是万一我想要的东西是不可能的,因为它完成了其他所有事情。
为了保持一切整洁,我会将文件符号链接到主项目目录中的适当位置。
最后的想法:
到目前为止,我看过或考虑过的所有事情似乎都没有按照我的意愿去做。在这一点上,我怀疑是否有适合我正在寻找的解决方案,但是,我希望有更多经验的人知道我忽略的东西可能会满足我的需求。如果没有,那么我想知道在不完美的解决方案中我最好的选择是什么。
继续努力
提交到所有分支。
居然有人问过这个here,答案是Git没有这个功能,并给出了原因。这是在黑暗中拍摄的,我不认为这是可能的,但是。 . .有希望吗?
我读过的其他内容:
https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree
https://spin.atomicobject.com/2016/06/26/parallelize-development-git-worktrees/
What would I use git-worktree for?
https://git-scm.com/book/en/v2/Git-Tools-Submodules
Difference between subprojects and submodules in Git?
https://www.quora.com/How-do-I-handle-sub-projects-using-Git
https://gist.github.com/gitaarik/8735255
https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407
https://medium.com/@porteneuve/mastering-git-subtrees-943d29a798ec
https://makingsoftware.wordpress.com/2013/02/16/using-git-subtrees-for-repository-separation/
What's the best practice for putting multiple projects in a git repository?
【问题讨论】:
-
听起来解决方案是笔记本。
-
@DanielMann 我猜你是我 SOL?
-
关于子模块的使用:虽然您的案例并不特别适合子模块(子模块及其状态 是 项目的一部分,因此在不同的分支中具有不同的根据定义的状态),那里没有“隐性错误”。
git status清楚地表明,如果子模块工作树与其原始状态不同,则需要担心。 -
@user3159253 谢谢。我会记住这一点,但是我实际上已经找到了足够接近我想要的东西;我已经写好了,但想在审查和发布之前退后一步。另外,我今天早些时候尝试了一种子模块方法,但它还有其他一些缺点。因为我想要每个 repo 一个遥控器,所以如果我运行
git push --mirror它会弄得一团糟。
标签: git version-control