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

时间:2014-11-24 20:42:29

标签: git

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

但是,一旦 克隆了一个组件,将其从构建中删除是有问题的:

  • 您可以删除工作目录中的文件,但git status将显示未提交的更改
  • 您可以删除存储库,但需要在需要时重新克隆
  • 您可以移动存储库,但您的多回购工具可能会有助于#34;再克隆

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

的内容

3 个答案:

答案 0 :(得分:2)

找到similar questions并不能完全按照我的意愿行事后,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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

我可以提出两种明显的方法来解决这个问题:
1.子树合并:创建一个仓库/分支,其唯一目的是让您将其他仓库的所需版本合并在一起,以便您拥有可重复的构造。 2.在您的“构建”中使用符号链接到回购。目录,这样你就可以把符号链接吹到那些你不想参与一个特定版本的回购中,而不会让回购的存在只是为了以后重新开放。