Git元数据-是否有一种方法可以添加独立于每个分支的Git元数据?

Git元数据-是否有一种方法可以添加独立于每个分支的Git元数据?,git,git-clone,Git,Git Clone,最终目标:我希望有Git跟踪的文件,但所有分支的文件版本都相同。如果忽略文件,则所有分支的文件都是相同的,但不幸的是,这些文件没有被跟踪。当我运行gitpush或类似程序时,我需要在repo之间传递这些文件,等等 例如,.git文件夹中的数据通常被git忽略。我想将一些数据添加到我的回购协议中,以便数据独立于所有分支,但仍然显示在所有分支中,当您克隆回购协议时,数据会显示出来 这可能吗?例如,如果.git目录如下所示: .git/ branches/ hooks/ objects/

最终目标:我希望有Git跟踪的文件,但所有分支的文件版本都相同。如果忽略文件,则所有分支的文件都是相同的,但不幸的是,这些文件没有被跟踪。当我运行
gitpush
或类似程序时,我需要在repo之间传递这些文件,等等

例如,.git文件夹中的数据通常被git忽略。我想将一些数据添加到我的回购协议中,以便数据独立于所有分支,但仍然显示在所有分支中,当您克隆回购协议时,数据会显示出来

这可能吗?例如,如果
.git
目录如下所示:

.git/
  branches/
  hooks/
  objects/
  config
  HEAD
  index
我正在考虑添加一个文件夹:

.git/
  .oresoftware/
把我的数据放在那里,数据独立于所有分支

我认为这行不通,因为.git回购协议中的数据实际上没有被跟踪。我正在寻找git跟踪的东西,但对所有分支都是一样的


更新:在阅读了答案并思考了一段时间后,我想如果我用新文件修改初始提交,那么它可能会神奇地工作,但当然Git不是这样工作的,每次提交都是一个完整的快照,因此事后更改历史提交不会更改较新的提交。

好的,我想我现在明白你的疑问了。基本上,您需要将数据添加到一个可见文件夹中,以便git跟踪它,即在其中一个分支中添加,并将该分支合并到
主节点
,然后将其他两个分支与
主节点
同步(
git fetch origin master&&git merge origin master
)。在这种情况下,由于您在git中添加了一个新的文件/文件夹,所以不会遇到合并冲突。最后,您的数据将在所有分支中可用。 EDIT(基于另一个用户的评论):
git cherry pick
是可以将特定提交应用于分支的另一种方法

。。。.git文件夹中的数据通常会被git忽略

这不仅是典型的,而且是Git安全模型所必需的

(过去,Git存在一些缺陷,您可以创建名为
.Git/whatever
的文件,然后将它们放入存储库,然后在Windows和MacOS上签出时存在于
.Git/whatever
中,因为这些系统默认忽略大小写:名为
.Git/foo
的文件实际上创建为
.Git/foo
,因为
>.git
此时存在。此错误已在现代git中更正。)

我想将一些数据添加到我的回购协议中,以便数据独立于所有分支,但仍然显示在所有分支中,当您克隆回购协议时,数据会显示出来

这可能吗

没有,但是有其他方法可以得到你想要的

克隆存储库相当于执行以下步骤:

  • 创建空目录(或使用现有目录):
    mkdir path
  • 在那里创建一个新的空Git存储库:
    cd路径&&Git init
  • 为URL添加一个远程,通常命名为
    origin
    git remote Add origin URL
  • 从远程获取所有信息:
    git-Fetch-origin
  • 通过
    git checkout
    git checkout branch
    ,创建一个分支,该分支通常是从在前面的
    git fetch
    步骤中创建的远程跟踪名称创建的
有许多历史特性,如果出现问题,还有一些问题,因此上面的方法并不完美。它还省略了可选的
git config
步骤。最后选择的要创建的分支是
-b
参数中的分支。如果
-b
参数指定了标记而不是分支,git只需在不创建任何分支的情况下签出分离的头。如果不提供
-b
参数,Git将使用来自远程的指令来确定要创建哪个分支。默认值以及通常的结果是
master
,创建为指向与
origin/master
相同的提交

一旦存储库中存在一个分支或一些分支,这些分支更准确地说,那些名称,如
master
develope
等,都属于存储库的所有者。它们可以对它们做任何想做的事;作为它们克隆的存储库的所有者,您无法阻止它们。您不能让他们的分支中显示一个文件。当然,我们可以这样说整个存储库,所以作为一个论点,这有点愚蠢:你确实不能控制他们;整个存储库是他们自己的

那么,你大概想让他们更容易地将一些内容安装到某个文件中。方法是让这些内容可以通过简单的名称访问。但是Git提供了什么名称呢

好的,在底层,Git存储的是提交,而提交又存储存储blob(文件内容)的树(路径名)。任何给定提交、树或blob的实际名称都是一个原始哈希ID,哈希ID是不可预测的,通常对人类不有用或不可访问。因此,您可以告诉人们,比如:

将哈希ID
1bdc91e282c5393c527b3902a208227c19971b84
提取到
.oresoftware/foo

但是(1)散列ID是不可理解的,(2)谁想输入所有这些?如果你有多个文件,你需要每个文件一个blob散列ID。真恶心

但有一种更好的方法可以做到这一点。您可以创建一个提交对象,其中包含名为
.oresoftware/foo
.oresoftware/bar
等文件。这是一个普通的提交,可以随时提取到普通的工作树中

现在假设您将此提交放在名为
ORESOFTWARE
的分支上