【问题标题】:Remove all git files from a directory?从目录中删除所有 git 文件?
【发布时间】:2011-01-27 21:50:47
【问题描述】:

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

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

【问题讨论】:

  • 您可以编写一个小脚本来执行此操作,但这取决于操作系统。

标签: git


【解决方案1】:

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

运行这个查找命令,它会列出当前文件夹下的所有.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,我输入反斜杠还是命令的一部分?
  • 是的 - 尾部斜杠是为了便于阅读。在这种形式下,我认为它符合“多行命令”的条件。
  • 在删除所有与 Git 相关的文件夹(如果进行 Android 开发)时,请考虑删除 .repo 文件夹(位于树的顶部)。 source.android.com/source/developing.html
  • 我会从.git find 语句中删除-type d 子句,因此子模块.git 文件也将被删除。
【解决方案2】:

cd 然后到存储库

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

确保不要意外地将单个点、斜杠、星号或其他正则表达式通配符通过管道传递到 find 中,否则 rm 会很乐意将其删除。

【讨论】:

  • 这很好,但我在find: ./.git: No such file or directory 之后收到了通知,但它可以工作。无论如何要阻止通知显示?
【解决方案3】:

.git 文件夹只存储在 repo 的根目录中,而不是像 subversion 一样的所有子目录。您应该可以只删除一个文件夹,除非您使用的是子模块...然后他们也会有一个。

【讨论】:

  • 啊太棒了,我以为它分布在所有子目录中,比如 svn!
  • 你为什么要删除它?使用git archive;就是为了这个目的,或者甚至只是将 .git 目录之外的所有内容都 tar 起来。
  • 您可能还想删除您的.gitignore 文件等。我想您可以编写一个脚本来执行此操作,但使用 git-archive 然后手动从存档版本中删除它们可能更简单。
  • Here 您可以找到 Jefromi 提到的如何使用 git archive 的示例。还有一个返回 Stackoverflow 问题 160608 的链接。
  • 你太聪明了。完全有可能拥有一个供应商目录,其中克隆了各种其他 repos。 Git 只存储一个根 .git 但你可以在任何地方都有 repos,例如。 vendor/something/something/.git.
【解决方案4】:

如果其他人偶然发现了这个主题 - 这里有一个更“一刀切”的解决方案。

如果您使用.git.svn,您可以使用--exclude-vcs 选项进行tar。这将忽略不同版本控制系统所需的许多不同文件/文件夹。

如果您想了解更多相关信息,请查看: http://www.gnu.org/software/tar/manual/html_section/exclude.html

【讨论】:

    【解决方案5】:

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

    git archive master | bzip2 > project.tar.bz2
    

    master 是所需的分支。

    【讨论】:

    • 这需要 2 小时而不是瞬时cp -r
    • @gcb: cp -r 不处理不属于存储库的文件和目录,其中也包括被忽略的文件和目录。但是,如果您确定不需要这个并且您的处理/时间很关键,请继续使用cp
    • 公平地说,git archive 有一个缺点——它不导出子模块。需要git submodule foreach --recursive git archive ...。非常糟糕!
    • 拒绝包含子模块是一个特点,而不是一个缺点。
    【解决方案6】:

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

    这个命令(它只是一个命令)将递归删除目录中的 .git 目录(和文件),而不删除顶级 git repo,如果你想提交所有文件而不删除,这很方便管理任何子模块。

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

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-20
        • 1970-01-01
        • 2010-11-05
        • 2012-03-05
        • 1970-01-01
        • 2012-12-05
        • 2017-11-27
        相关资源
        最近更新 更多