没有工作树的存储库上的Git操作?

没有工作树的存储库上的Git操作?,git,Git,遗留项目的构建工作流应该签出特定的git版本标记并编译该源代码。 我建议保持它的简单性,并像这样使用Git Cli: git clone –b $versiontag –singlebranch $gitrepouri 而不是git克隆和git签出标记 为了“节省时间”,同事希望使用另一种方法=从另一台服务器的现有git存储库复制.git文件夹 创建工作目录,然后对该文件夹进行操作 起初,她在复制后尝试使用git checkout$versiontag。 输出有多个条目,如: $ git ch

遗留项目的构建工作流应该签出特定的git版本标记并编译该源代码。 我建议保持它的简单性,并像这样使用Git Cli:

git clone –b $versiontag –singlebranch $gitrepouri
而不是git克隆和git签出标记

为了“节省时间”,同事希望使用另一种方法=从另一台服务器的现有git存储库复制.git文件夹 创建工作目录,然后对该文件夹进行操作

起初,她在复制后尝试使用git checkout$versiontag。
输出有多个条目,如:

$ git checkout tags/sometag
D       Foobar/somefile
D       Foobar/someotherfile
[...]
Note: checking out 'tags/sometag'.

You are in 'detached HEAD' state.
[...]
但是工作树的内容不同于普通的git克隆和git签出,尽管两者都假定处于 拆下的头部状态和已签出该特定标签。
像Sonarqube这样的工具也有问题,因为git责备不起作用(缺少责备信息)

之后,她在拷贝后尝试了
git稀疏签出
,乍一看似乎奏效了
- 尽管与简单的gitcli方法相比,它要复杂得多


在没有工作树的情况下对Git存储库使用Git命令的缺点是什么?

Git有一个内部设置,告诉自己它正在使用一个没有工作树的克隆。具体来说,对于这样的存储库,
core.bare
应该设置为
true

手动复制存储库,而不是使用
git clone
复制它,而是复制它的配置文件(
.git/config
.git/info/
文件)。这包括
core.bare
设置和Git自己创建的几个设置,用于描述运行Git的机器和文件系统的行为。如果这些设置不能反映实际的机器和实际的文件系统,则可能会以各种方式出现问题。一些
info
文件可能会将Git指向未复制的其他目录;如果是这样,您还需要知道如何处理这些问题。因此,除非您知道如何处理这些其他变量和
info
文件,否则不要使用
cp-r
(或
tar
或类似工具)直接复制
.git
目录

复制原始
.git
存储库也会复制该存储库的索引。索引描述了工作树,因此,如果新位置没有工作树,则复制的索引将自动不正确。(注意:所有存储库,包括裸存储库,都有一个索引。初始裸存储库的索引通常为空,但请参见下文。)

也就是说,您可以在裸存储库上执行一些Git操作。具体来说,您可以执行任何不需要工作树的操作。这意味着,如果您知道您正在对特殊控制变量做什么,您可以将
.git
存储库复制到其他地方,然后使用它。由于您将避免使用工作树的操作,这意味着避免
git checkout
,例如,损坏的索引不是问题,尽管如果您要如此聪明,这可能太聪明了一半,您还可以知道何时删除损坏的索引是安全的

您还可以使用
git--work tree=…
git\u work\u tree=git…
为裸存储库提供临时工作树。如果执行此操作,则会覆盖
核心.bare
设置,并且bare存储库的索引用于跟踪给定的
。请注意,如果更改路径,将使索引无效;在这种情况下,您必须使用另一个索引(通过将
GIT_index_FILE
设置为备用索引)或删除现有索引


因此,考虑到上述所有注意事项,您可以将
.git
目录转换为适当的裸git存储库,或者使用
cp
tar
将包含或不包含当前工作树的
.git
目录移植到具有新工作树的新位置。但一般来说,您不应该这样做,因为如果您这样做,您必须对Git的未来版本做出很多假设。Git承诺,
Git clone
Git bundle
等将继续以现在的方式工作;Git不保证在复制的
.Git
目录上偷偷地进行手术会继续以同样的方式工作。

Git有一个内部设置,告诉自己它正在使用一个没有工作树的克隆。具体来说,对于这样的存储库,
core.bare
应该设置为
true

手动复制存储库,而不是使用
git clone
复制它,而是复制它的配置文件(
.git/config
.git/info/
文件)。这包括
core.bare
设置和Git自己创建的几个设置,用于描述运行Git的机器和文件系统的行为。如果这些设置不能反映实际的机器和实际的文件系统,则可能会以各种方式出现问题。一些
info
文件可能会将Git指向未复制的其他目录;如果是这样,您还需要知道如何处理这些问题。因此,除非您知道如何处理这些其他变量和
info
文件,否则不要使用
cp-r
(或
tar
或类似工具)直接复制
.git
目录

复制原始
.git
存储库也会复制该存储库的索引。索引描述了工作树,因此,如果新位置没有工作树,则复制的索引将自动不正确。(注意:所有存储库,包括裸存储库,都有一个索引。初始裸存储库的索引通常为空,但请参见下文。)

也就是说,您可以在裸存储库上执行一些Git操作。具体来说,您可以执行任何不需要工作树的操作。这意味着如果你知道你在用respec做什么