将Git工作目录转换为类似裸库的仓库?

v1l68za4  于 2023-09-29  发布在  Git
关注(0)|答案(3)|浏览(119)

我们的开发环境使用多个存储库作为整个构建系统的一部分。构建会根据您 checkout 的存储库动态调整:如果不需要构建特定组件,就不要克隆它。
然而,一旦你克隆了一个组件,从构建中删除它是有问题的:

  • 您可以删除工作目录中的文件,但git status将显示未提交的更改
  • 您可以删除存储库,但需要在再次需要时重新克隆
  • 您可以移动存储库,但是您的多存储库工具可能会“有帮助地”重新克隆

有没有更好的方法来删除工作目录中的文件?类似于hg co nullp4 sync ...#none

c3frrgcw

c3frrgcw1#

在发现similarquestions没有完全实现我想要的功能后,this article提供了答案:创建一个空分支。

git checkout --orphan empty
git rm -rf .
git commit --allow-empty -m "An empty working directory"

当然,首先要确保您已经将任何重要文件提交到了存储库中。我将此分支命名为empty,但您可以通过checkout命令给予任何名称。
设置好后,您可以切换到任何分支来取回文件:

git checkout master

当你需要“删除”工作目录时,提交你的更改,然后运行:

git checkout empty

这将删除所有跟踪的文件。如果您还需要删除未跟踪的文件和目录,请执行以下操作:

git clean -fdx
h6my8fg2

h6my8fg22#

您可以使用--assume-unchanged功能:

git ls-files big-unused-component | xargs git update-index --assume-unchanged

然后,您可以删除您的文件:

rm -rf big-unused-component

第一个命令列出big-unused-component目录中所有被跟踪的文件,然后update-index --assume-unchanged在Git索引中设置“假定此文件未更改”位。然后,当您删除整个目录时,Git不会认为这是一个更改。
要撤消上一个命令的效果,请使用--no-assume-unchanged重复该命令。git ls-files -v命令可以显示哪些文件以这种方式被忽略。

gupuwyp2

gupuwyp23#

git clean可以与各种参数一起使用,以删除未签入和提交的项,听起来比上面的任何选项都要好。创建一个新的分支似乎完全违反直觉,提交虚假的更改也是如此,这些更改会删除只是为了单独恢复的内容。
对于我自己的许多CI构建脚本,我确实使用了这样的东西来确保构建区域与git的构建区域100%原始:git clean -f -x -d
然而,在进一步阅读时,你的问题的混乱本质变得稍微明显一些。这听起来就像你有多个单独的仓库在一个共同的文件夹和您的'构建'过程分别使用它们所有的各种事情。
我可以想出两个明显的方法来解决这个问题:
1.子树合并:创建一个repo/分支,其唯一的目的是将其他repo的所需版本合并到一起,以便获得可重复的构建
2.在你的'build'目录中使用符号链接到仓库,这样你就可以吹掉符号链接到仓库,你不想参加一个给定的构建,而不会吹掉仓库的存在,只是为了以后重新克隆。

相关问题