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