从目录中删除所有git文件?


75

我有一个受版本控制的文件夹。我想对其进行复制,但不想在其下面包含所有.git目录和文件。

有没有办法删除所有的git文件,而不是手动删除它们?


您可以编写一个小脚本来执行此操作,但这将特定于操作系统。
马滕

Answers:


91

.git文件夹仅存储在存储库的根目录中,而不是所有子目录(如subversion)。除非您正在使用子模块,否则您应该只能够删除该文件夹之一,那么它们也将具有一个文件夹。


8
太棒了,以为它是分布在svn之类的所有子目录中的!
user291701 2011年

8
为什么要删除它?使用git archive; 为此,甚至只是将.git目录以外的所有内容都压缩。
卡斯卡贝尔2011年

1
您可能还希望删除.gitignore文件等。我猜您可以编写一个脚本来执行此操作,但是仅使用git-archive然后从存档版本中手动删除它们可能会更简单。
MatrixFrog 2011年

3
在这里,您可以找到git archiveJefromi提及的使用方法示例。还有一个链接返回到Stackoverflow问题160608
Lernkurve'2

3
您变得不必要地聪明。完全有可能在供应商目录中克隆了各种其他存储库。Git只存储一个根,.git但是您可以在任何地方都有存储库,例如。vendor/something/something/.git
srcspider 2013年

66

如何.git在Linux中删除文件夹下的所有目录。

运行以下find命令,它将列出.git当前文件夹下的所有目录:

find . -type d -name ".git" \
&& find . -name ".gitignore" \
&& find . -name ".gitmodules"

印刷品:

./.git
./.gitmodules
./foobar/.git
./footbar2/.git
./footbar2/.gitignore

应该只有3或4个.git目录,因为git每个项目只有一个.git文件夹。您可以rm -rf yourpath手动完成以上每个操作。

如果您想将它们全部删除并以危险的方式生活:

//Retrieve all the files named ".git" and pump them into 'rm -rf'
//WARNING if you don't understand why/how this command works, DO NOT run it!

( find . -type d -name ".git" \
  && find . -name ".gitignore" \
  && find . -name ".gitmodules" ) | xargs rm -rf

//WARNING, if you accidentally pipe a `.` or `/` or other wildcard
//into xargs rm -rf, then the next question you will have is: "why is
//the bash ls command not found?  Requiring an OS reinstall.

@Jay Taylor,我输入反斜杠还是命令的一部分?
埃里克·莱斯钦斯基

是的-斜杠用于可读性。我想以这种形式将其称为“多行命令”。
杰伊·泰勒

.repo删除所有与Git相关的文件夹时(如果进行Android开发),请考虑删除该文件夹(在树的顶部)。source.android.com/source/developing.html
CJBS 2015年

我将从find语句中删除该-type d子句.git,因此子模块.git文件也将被删除。
pperejon

17

cd 然后到存储库

find . -name ".git*" -exec rm -R {} \;

确保不要意外地将单个点,斜杠,星号或其他正则表达式通配符插入到find中,否则rm将很高兴将其删除。


1
太好了,但是在find: ./.git: No such file or directory它起作用后我会收到通知。无论如何要停止显示通知?
罗汉·德什潘德

16

您可以使用git-archive,例如:

git archive master | bzip2 > project.tar.bz2

master所需的分支在哪里。


相较于瞬时,这需要2小时cp -r
gcb

2
@gcb:cp -r不处理不属于存储库的文件和目录,其中也包括被忽略的文件和目录。但是,如果您确定不需要此操作,并且您的处理/时间很关键,那么请继续cp
jweyrich 2011年

4
公平地说,git archive有一个缺点-它不导出子模块。一个需要git submodule foreach --recursive git archive ...。太糟糕了!
jweyrich

拒绝包含子模块是一个功能,而不是缺点。
威廉·珀塞尔



1

ls | xargs查找2> / dev / null | egrep /\.git$ | xargs rm -rf

该命令(只是一个命令)将递归地删除目录中的.git目录(和文件),而不会删除顶级git repo,这对于在不管理任何子模块的情况下提交所有文件非常方便。

找到2> / dev / null | egrep /\.git$ | xargs rm -rf

此命令将执行相同的操作,但还将从顶级目录中删除.git文件夹。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.