2014-11-24 89 views
4

我们的开发环境使用多个存储库作为整个构建系统的一部分。构建会根据您已检出的存储库进行动态调整:如果不需要构建特定组件,则不要克隆它。将Git工作目录转换为裸露的存储库?

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

  • 您可以删除的文件在工作目录,但git status会显示未提交的修改
  • 你可以删除的存储库中重新克隆的代价,当你再次需要它
  • 您可以将资源库,但你多回购工具可能“有益”再克隆

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

回答

2

发现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 
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在Gi中设置“假定此文件未更改”位t指数。然后,当你删除整个目录时,Git不会考虑这个更改。

要取消上一个命令的效果,请使用--no-assume-unchanged重复此操作。 git ls-files -v命令可以以这种方式显示哪些文件已被忽略。

+1

这比git checkout empty要记住的要难得多。 – Syeberman 2014-11-24 21:22:53

+0

@Syeberman:恐怕我没有看到如何创建一个空分支来解决你的问题。不会创建分支从存储库中删除* all *文件? – 2014-11-24 21:56:15

+0

其实,这正是*我想要做的。 Mercurial有'hg co null'和Perforce'p4 sync ...#none'。我需要一种方法来删除跟踪的文件,同时仍然保留.git目录中的所有历史记录。 – Syeberman 2014-11-25 23:21:58

0

git clean可以与各种参数一起使用,以删除未签入和提交的项目,并且听起来像比上面提到的任何更好的选项。创建一个新的分支看起来完全违背了直觉,就像提交假的更改一样,只需要单独恢复即可。

对于很多我自己的CI构建脚本我使用这样的事情,以确保建设面积为100%纯净的什么混帐有它:git clean -f -x -d

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

我能想出两个明显的方式来解决这个问题:
1.子树合并:创建一个回购/支,其唯一目的是你子树合并其他回购所需的版本在了一起,让你有一个可重复的版本
2.使用符号链接到您的'build'目录中的仓库,这样你就可以吹掉符号链接回购仓库,你不想参与给定的构建,而不会丢弃回购的存在只是以后再recloned 。

+0

这将删除未跟踪的文件和目录,是的。我需要的是一种删除*追踪*文件的方法,但只是暂时的。 – Syeberman 2014-11-24 21:21:39

+0

已更新。除去删除跟踪文件意味着你使用git错误。也许与其询问如何实施一些涉及许多不良做法的奇怪计划,您可以直接提出有关您试图达成的目标的问题 – UpAndAdam 2014-11-24 21:26:06

+0

我应该澄清我上面的陈述;删除跟踪文件本身并没有错。这当然是为什么git rm存在:-p删除它们不是为了从GIT中实际删除它们,而是仅仅为了“build”,我想说的是'错误'。 – UpAndAdam 2014-11-24 21:33:00

相关问题