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

90

我有一个在版本控制下的文件夹。我想复制它以便发送,但不想包含所有.git目录和其中的文件。

是否有一种方法可以删除所有git文件而不是手动删除它们?


你可以编写一个小脚本来完成这个任务,但那将是特定于操作系统的。 - Matten
9个回答

100

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

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

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

输出:

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

对于每个项目,git只有一个.git文件夹,因此应该只有3或4个.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,我需要输入反斜杠吗?还是这是命令的一部分? - Eric Leschinski
是的-尾部斜杠是为了可读性。在这种形式下,我想它可以被称为“多行命令”。 - Jay Taylor
在删除所有与 Git 相关的文件夹时(如果进行 Android 开发),请考虑删除树顶上的 .repo 文件夹。http://source.android.com/source/developing.html - CJBS
我会从.git查找语句中删除-type d子句,这样子模块的.git文件也会被删除。 - pperejon

97

.git文件夹只存储在仓库的根目录中,而不像Subversion那样存储在所有子目录中。你应该只需要删除那个文件夹,除非你正在使用Submodules...然后它们也会有一个。


9
好的,我会尽力为您翻译。原文是“Ah terrific, was thinking it was distributed among all subdirs like svn!”。我的翻译是:“啊,太好了,之前以为文件像svn一样分布在所有子目录中!” - user291701
8
为什么要“删除”它?使用 git archive,它就是为此而设计的,或者只需压缩除 .git 目录以外的所有内容即可。 - Cascabel
3
在这里,您可以找到如何使用git archive的示例,这是Jefromi提到的。还有一个链接回Stackoverflow问题160608 - Lernkurve
3
你不必过于聪明。完全可以有一个包含各种其他克隆库的供应商目录。Git只存储根目录 .git,但你可以在任何地方拥有克隆库,例如 vendor/something/something/.git - srcspider
1
不要忘记.gitmodules文件和任何相应的子模块。 - Jay Taylor
显示剩余2条评论

25

cd到仓库,然后

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

确保不要无意中通过管道将单个点、斜杠、星号或其他正则表达式通配符传递给find命令,否则rm命令将会高兴地删除它。


2
这很好,但是在“find: ./.git: No such file or directory”之后我收到了一个通知,尽管它仍然有效。有没有办法停止显示通知? - Rohan Deshpande
如果你确定结果,你可以在结尾处添加 2>/dev/null 来消除 find: ./.git: No such file or directory 错误。 - Thomas Brooks

16

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

git archive master | bzip2 > project.tar.bz2

其中master是所需的分支。


这需要2小时,而不是瞬间的cp -r - gcb
3
@gcb:cp -r 不处理不属于存储库的文件和目录,这也包括被忽略的文件。但是,如果您确定不需要这些文件,并且您的处理/时间很关键,那么可以使用 cp 命令。 - jweyrich
4
公正地说,“git archive”有一个缺点-它不导出子模块。需要使用“git submodule foreach --recursive git archive ...”。非常糟糕! - jweyrich
拒绝包含子模块是一种特性,而非缺陷。 - William Pursell

8
如果其他人也遇到了这个问题 - 这里有一个更适用于所有情况的解决方案。如果您正在使用.git或.svn,则可以在tar中使用--exclude-vcs选项。这将忽略许多不同版本控制系统所需的文件/文件夹。如果您想了解更多信息,请查看:http://www.gnu.org/software/tar/manual/html_section/exclude.html

1

1

与 SVN 或 CVS 等其他源代码控制系统不同,git 将其所有元数据存储在一个 单一 目录中,而不是在项目的每个子目录中。因此,只需从根目录中删除 .git(或使用类似 git-export 的脚本),您就可以顺利完成。


1

sudo find -name .git -exec rm -fr {} ;

可以翻译为“使用sudo命令查找名为.git的文件并删除它们”。

1

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

这个命令(只有一个命令)将递归地删除目录中的.git目录(和文件),而不会删除顶级git仓库,如果您想提交所有文件而不管理任何子模块,则非常方便。

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

这个命令也会做同样的事情,但还会从顶层目录中删除.git文件夹。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接