繁体   English   中英

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

[英]Convert a Git working directory to a bare-like repository?

我们的开发环境使用多个存储库作为整体构建系统的一部分。 构建动态地根据您检出的存储库进行调整:如果您不需要构建特定组件,则不要克隆它。

然而,一旦你已经克隆一个组成部分,从构建删除它是有问题的:

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

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

在找到类似的 问题并没有完全按照我的意愿行事之后, 本文提供了答案:创建一个空分支。

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

您可以使用--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命令可以显示以这种方式忽略了哪些文件。

git clean可以与各种参数一起使用来删除未签入和提交的项目,听起来比上面提到的任何选项都要好得多。 创建一个新的分支似乎完全违反直觉,因为提交了错误的更改,这些更改会删除要单独恢复的内容。

对于我自己的许多CI构建脚本,我确实使用类似这样的东西来确保构建区域对于git具有的100%纯净: git clean -f -x -d

但是,经过进一步阅读,您问题的混乱性质会变得更加明显。 听起来你在一个公共文件夹中有多个单独的存储库,而你的“构建”过程分别将它们全部用于各种事物。

我可以想出两个明显的方法来解决这个问题:
1.子树合并:创建一个repo / branch,其唯一目的是为了子树合并所需的其他repos版本,以便你有一个可重复的构建
2.使用符号链接到你的“build”目录中的repos,这样你就可以将符号链接清除到你不想参与给定构建的repo,而不会破坏repo的存在只是为了以后重新编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM