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

时间:2018-08-10 22:34:55

标签: git git-clone

最终目标::我想要Git跟踪的文件,但这些文件与所有分支的版本相同。如果您使用gitignore文件,则所有分支的文件都相同,但不幸的是没有被跟踪。当我运行git push之类的东西时,我需要这些文件在存储库之间传递,等等。

例如,.git文件夹中的数据通常被git忽略。我想向回购中添加一些数据,以便该数据独立于所有分支,但仍出现在所有分支中,并且在克隆回购时,数据会显示出来。

这可能吗?因此,例如,如果.git目录类似于:

.git/
  branches/
  hooks/
  objects/
  config
  HEAD
  index

我正在考虑添加一个文件夹:

.git/
  .oresoftware/

并将我的数据放在那里,那里的数据与所有分支无关。

我认为这行不通,因为.git存储库中的数据并未真正被跟踪。我正在寻找git跟踪的内容,但所有分支都相同...

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

2 个答案:

答案 0 :(得分:1)

好的,我想我现在已经理解了您的查询。基本上,您需要将数据添加到可见文件夹中,以便git在一个分支中跟踪数据,即git add <data>并将merge的该分支复制到master,然后与其他两个分支同步mastergit fetch origin master && git merge origin master)。在这种情况下,由于您在git中添加了新文件/文件夹,因此不会遇到合并冲突。最后,您的数据将在所有分支机构中可用。 编辑(基于其他用户的评论):git cherry-pick <commit-hash>是将特定提交应用于分支的另一种方法。

答案 1 :(得分:1)

  

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

这不仅是典型,对于Git的安全模型来说,它是必需的

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

  

我想向回购中添加一些数据,以便该数据独立于所有分支,但仍出现在所有分支中,并且在克隆回购时,数据会显示出来。

     

这可能吗?

否-但是还有其他方法来获得想要的东西。

克隆存储库等效于以下步骤:

  • 创建一个空目录(或使用现有目录):mkdir path
  • 在此处创建一个新的空Git存储库:cd path && git init
  • 为网址origin添加一个远程,通常命名为git remote add origin url
  • 从该远程设备上获取所有内容:git fetch origin
  • 通过git checkoutgit checkout branch创建分支,其中 branch 通常是根据在上一个git fetch步骤中创建的远程跟踪名称创建的。

历史上有许多特殊性,如果出现问题,还会出现一些问题,因此上述内容并不是很完美。它还省略了可选的git config步骤。最后要创建的分支是-b自变量中的分支。如果您的-b参数命名的是标签而不是分支,则Git仅签出分离的HEAD而不创建任何分支。如果不提供-b参数,则Git会使用来自远程的指令来找出要创建的分支。默认设置(因此是通常的结果)是master,其创建目的是指向与origin/master相同的提交。

一旦存储库中有一个或多个分支,则这些分支(更准确地说,是这些名称,例如masterdevelop等)由拥有该存储库的任何人拥有。他们可以随心所欲地做任何事。作为克隆的存储库的所有者,您无法阻止它们。您不能 make 他们的分支中显示文件。当然,我们可以对整个存储库这么说,这有点愚蠢:您无法控制它们,这是事实。整个存储库是他们的职责。

那么,大概想要让他们容易 以便他们将某些内容安装到文件中的某个位置。这样做的方法是通过一些简单的名称来访问内容。但是Git提供什么名字?

在最底层,Git存储的是 commits ,它们又存储了存储 blob (路径名)(文件内容)。任何给定的提交,树或Blob的实际名称都是原始的哈希ID,并且哈希ID是不可预测的,通常对人类没有帮助或无法访问。因此,您可以告诉别人:

  

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

但是(1)哈希ID难以理解,(2)谁想输入所有内容?而且,如果您有多个文件,则每个文件需要一个Blob哈希ID。 uck!

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

现在,假设您将此提交放在名为ORESOFTWARE的分支上。然后,您可以告诉人们他们应该:

  

运行git checkout origin/ORESOFTWARE -- .oresoftware && git reset .oresoftware

诚然,它实际上并不短,但至少不充满无法理解的哈希ID。

git checkout将在他们的工作树中创建.oresoftware,只要他们具有git fetch(来自git clone)将创建的远程跟踪名称即可。 。 1 git reset .oresoftware将删除.oresoftware在其索引中创建的git checkout条目。如果/.oresoftware/中列出了.gitignore,则工作树文件将被忽略。这意味着您在每个分支的每个提示提交中都必须有一个.gitignore,以便可以方便地自动忽略目录,但这很容易。

最后,您可以说:

代替指导人们运行两个看似魔术的Git命令,

  

运行./setup.sh

,这意味着您可以将两个Git命令放入外壳脚本setup.sh中,该脚本在每个分支提示中提供,就像在每个分支提示中提供.gitignore文件一样。而且,您甚至可以使您的软件构建过程自动自动运行./setup.sh,这样就不需要执行任何特殊操作。

如果您决定更改.oresoftware中的文件,则只需要在自己的ORESOFTWARE分支上进行一次新提交即可。它可以(可能应该)仅包含.oresoftware目录。由于构建过程会在每次构建时都重新提取目录,因此git fetch将为您的用户提供更新的origin/ORESOFTWARE远程跟踪名称,然后将为他们获取更新的文件。