通常 .git 文件夹中的数据会被 Git 忽略。
这不仅是典型情况,对于 Git 的安全模型来说也是必要的。
(过去,Git 存在一些 bug,你可以创建名为 .GIT/whatever 的文件并将它们放入仓库中,然后在 Windows 和 MacOS 上检出时它们会存在于 .git/whatever 中,因为这些系统默认忽略大小写:一个名为 .GIT/foo 的文件实际上会被创建为 .git/foo,因为此时 .git 已经存在。这个 bug 在现代的 Git 中已经得到了修复。)
我想添加一些数据到我的仓库,使这些数据独立于所有分支,但仍然出现在所有分支中,而且当你克隆仓库时,这些数据也会显示出来。
这种情况可能吗?
不可能,但有其他方法可以实现你的需求。
克隆一个仓库相当于以下步骤:
- 创建一个空目录(或使用现有的目录):
mkdir path
。
- 在此处创建一个新的、空的 Git 存储库:
cd path && git init
。
- 为 URL 添加一个名为
origin
的 远程: git remote add origin url
。
- 从该远程获取所有内容:
git fetch origin
。
- 通过
git checkout
创建一个分支:git checkout branch
,其中 branch 通常是从前面的 git fetch
步骤中创建的远程跟踪名称。
有一些历史特殊性,以及如果出现问题的话可能会存在问题,因此上述方法并不完美。它还省略了一个可选的git config
步骤。最后创建的分支是您-b
参数指定的分支。如果您的-b
参数命名为标签而不是分支,则Git只会检出一个分离的HEAD,而不创建任何分支。如果您没有提供-b
参数,则Git使用来自远程的指令来确定要创建哪个分支。默认情况下,也就是通常情况下,会创建一个指向与origin/master
相同提交的master
分支。
一旦在存储库中有一个分支或多个分支,这些分支——更准确地说,那些名称,如“master”和“develop”等——都归属于拥有存储库的人。他们可以为所欲为;你作为克隆它们的存储库的所有者,无法阻止他们。你不能让他们在他们的分支中显示某个文件。当然,我们也可以这样说整个存储库,这样的论点有点荒谬:你确实无法控制他们;整个存储库都是他们自己想怎么处理就怎么处理。
因此,你想要的是使他们能够轻松地将某些内容安装到某个文件中。做到这一点的方法是使内容可以通过一些简单的名称访问。但是Git提供了哪些名称呢?
在底层,Git 存储的是提交(commits),这些提交又存储了树(trees)(路径名),这些树又存储了 blob(文件内容)。任何给定的提交、树或 blob 的实际名称都是原始哈希 ID,哈希 ID 是不可预测的,并且通常对人类不太有用或无法访问。因此,你可以告诉人们提取哈希 ID 为 1bdc91e282c5393c527b3902a208227c19971b84 的内容到 .oresoftware/foo 中,但是(1)哈希 ID 是难以理解的,(2)谁想要输入那么多?如果你有多个文件,你需要一个 blob 哈希 ID 对应一个文件。很烦人!但有更好的方法。你可以创建一个包含名为 .oresoftware/foo、.oresoftware/bar 等文件的提交对象。这是一个普通的提交,可以随时提取到普通的工作树中。
现在假设您将此提交放在名为ORESOFTWARE
的分支上。然后您可以告诉其他人应该运行:
git checkout origin/ORESOFTWARE -- .oresoftware && git reset .oresoftware
这样做可能并不更短,但至少没有充满难以理解的哈希ID。
只要他们有远程跟踪名称(来自git clone
的git fetch
),git checkout
就会在他们的工作树中创建.oresoftware
。 git reset .oresoftware
将从索引中删除git checkout
在其中创建的.oresoftware
条目。 如果/.oresoftware/
在.gitignore
中列出,则工作树文件将被忽略。 这意味着您必须在每个分支的每个提示提交中都有一个.gitignore
,以便该目录将方便地自动忽略,但这很容易做到。
最后,您可以说,而不是指导其他人运行两个看似神奇的Git命令:
运行 ./setup.sh
这意味着你可以把这两个Git命令放进一个shell脚本setup.sh
中,然后在每个分支的末端提供这个脚本,就像你在每个分支末端提供.gitignore
文件一样。此外,你甚至可以让你的软件构建过程自动运行./setup.sh
,这样你就不需要他们采取任何特殊的行动。
如果你决定更改.oresoftware
中的文件,你只需要在自己的ORESOFTWARE
分支上进行新的提交。这可以(并且可能应该)只包含.oresoftware
目录。因为构建过程会在每次构建时重新提取目录,所以git fetch
将获取你的用户更新的origin/ORESOFTWARE
远程跟踪名称,然后会得到更新的文件。
.git\
文件夹中,而您知道它不会被跟踪? - vsr