最终目标::我想要Git跟踪的文件,但这些文件与所有分支的版本相同。如果您使用gitignore文件,则所有分支的文件都相同,但不幸的是没有被跟踪。当我运行git push
之类的东西时,我需要这些文件在存储库之间传递,等等。
例如,.git文件夹中的数据通常被git忽略。我想向回购中添加一些数据,以便该数据独立于所有分支,但仍出现在所有分支中,并且在克隆回购时,数据会显示出来。
这可能吗?因此,例如,如果.git
目录类似于:
.git/
branches/
hooks/
objects/
config
HEAD
index
我正在考虑添加一个文件夹:
.git/
.oresoftware/
并将我的数据放在那里,那里的数据与所有分支无关。
我认为这行不通,因为.git存储库中的数据并未真正被跟踪。我正在寻找git跟踪的内容,但所有分支都相同...
更新:在阅读了答案并思考了一段时间之后,我想也许是如果我用新文件修改初始提交,那么它就可以神奇地工作,但是Git当然不是这样工作的,每个提交都是一个总快照,因此在事实提交后更改历史提交不会更改较新的提交。
答案 0 :(得分:1)
好的,我想我现在已经理解了您的查询。基本上,您需要将数据添加到可见文件夹中,以便git在一个分支中跟踪数据,即git add <data>
并将merge
的该分支复制到master
,然后与其他两个分支同步master
(git 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
。cd path && git init
。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会使用来自远程的指令来找出要创建的分支。默认设置(因此是通常的结果)是master
,其创建目的是指向与origin/master
相同的提交。
一旦存储库中有一个或多个分支,则这些分支(更准确地说,是这些名称,例如master
和develop
等)由拥有该存储库的任何人拥有。他们可以随心所欲地做任何事。作为克隆的存储库的所有者,您无法阻止它们。您不能 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
远程跟踪名称,然后将为他们获取更新的文件。