【问题标题】:How to have a tracked file in a git repo that doesn't change from branch to branch如何在 git repo 中有一个不会从分支更改为分支的跟踪文件
【发布时间】: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


【解决方案1】:

我有一个相当满意的解决方案。面对我之前考虑过的所有事情,我考虑了它们的组合。特别是工作树和孤立的分支。

概念

这个概念是在一个孤立的分支上拥有一个工作树。

孤儿与项目中的其他任何东西没有任何共同之处,这是理想的,因为规划文档不是代码的一部分。此方法会产生一个空目录,因此不会造成混乱。它只是看起来像另一个目录,但您确实必须进行一组单独的提交,尽管我认为有一种方法可以同时提交所有分支。

怎么做。

第 1 步:进行回购

mkdir myRepo
cd myRepo
git init

第 2 步:进行初始提交

这里需要一些提交,以便可以制作工作树。

git commit -m --allow-empty "initial commit"

第 3 步:设置工作树

mkdir Plan
git worktree add --detach Plan
cd Plan

最初我说过要使用目录“规划”,但 Git 有时会感到困惑;它并不总是知道你是指分支还是目录。

第四步:建立分支

git checkout --orphan=planning
git commit -m --allow-empty "initial commit"

没有必要在孤立分支之前创建工作树,但它更容易。这两种方法我都做过,这种方法看起来更干净。

第 5 步:添加排除项

echo "Plan/" >> .git/info/exclude

第 6 步(可选):克隆

此结构未存储在遥控器中。您需要采取一些额外的步骤来重新创建它。

cd myRepo
mkdir Plan
git fetch origin planning:planning
git worktree add Plan planning
echo "Plan/" >> .git/info/exclude

#结果

我现在有两个工作区,其中一个与另一个分离。我唯一能看到出错的是在 ./planning/ 中并意外检查了一个分支,以为我在 repo 的其他地方。

##需要改进的地方

如果我可以在此设置中添加两个功能,那就是允许我防止更改工作树中的分支(或者更好地为工作树提供自己的一组分支)并允许我使用单个提交所有工作树分支git commit 命令。

这种结构在克隆时并未完全重建。这是一个实际问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2013-11-15
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    相关资源
    最近更新 更多