【问题标题】:Zip a git repository directory with `.git` directory included压缩包含 `.git` 目录的 git 存储库目录
【发布时间】:2016-09-06 01:56:31
【问题描述】:

我正在尝试压缩包含 .git 目录的 git 存储库目录。我尝试在目录上执行 tar,但它创建了一个比原始文件夹更大的文件夹,因为它附加了所有子模块。

我尝试了以下命令,但它们在压缩时没有.git 目录-

git archive master --format=tar --output="../gridImageSearch.zip"

以下命令用.git目录压缩,但是文件夹太大-

tar -zcvf ../blah.tar.gz blah

有什么建议吗?

【问题讨论】:

    标签: git zip gzip tar


    【解决方案1】:

    使用

    压缩 git 存储库
    tar -c -f - foo | gzip >foo.tgz
    

    如果您希望在没有.git 目录的情况下压缩存储库,请运行

    tar -c --exclude .git -f - foo | gzip >foo.tgz
    

    【讨论】:

      【解决方案2】:

      如果您的 git 存储库目录包含未版本控制的文件并且您不想将它们包含在 zip 文件中,则更简单的替代方法是将存储库 git clone 到一个新目录,然后压缩整个新目录。

      【讨论】:

        【解决方案3】:

        这是一个可能的答案。您可以使用find 命令生成存储库中所有文件的列表,不包括子模块中包含的文件。我们将子模块标识为“包含.git 目录的目录”。查找命令是:

        find . \( \! -depth 0 -type d -execdir test -f {}/.git \; -prune \) \
          -o -type f -print
        

        意思是“查看此目录中包含的所有内容,如果是目录并且包含名为.git的目录并且不是顶级目录,则不要下入其中,否则打印出文件名”。

        您可以将其用作tar 命令的输入:

        tar -T- -n -cz -f repo.tar.gz
        

        接受标准输入上的文件列表(-T-,确保不递归到子目录(因为find 已经为我们完成了),并创建(-c)gzip 压缩(-z)输出。

        完整的命令如下:

        find . \( \! -depth 0 -type d -execdir test -f {}/.git \; -prune \) \
          -o -type f -print |
        tar -T- -n -cz -f repo.tar.gz
        

        这将在您的当前目录中创建一个名为 repo.tar.gz 的压缩 tar 存档。

        这将失败的方式:

        • 如果不使用git archive,您可能会不小心在工作目录中包含不属于 git 存储库的文件。使用git clean 可以帮助避免这种情况。

        • 您还可以构建一个存档,其中包含尚未提交到存储库的更改。您可以通过在运行脚本之前显式检查未提交的更改来避免这种情况。

        【讨论】:

          猜你喜欢
          • 2011-11-03
          • 2012-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-08
          • 1970-01-01
          • 1970-01-01
          • 2015-05-15
          相关资源
          最近更新 更多