使用包含在内的`.git`目录压缩git存储库目录

时间:2016-09-06 01:56:31

标签: git zip gzip tar

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

我尝试了以下命令但是它们没有.git目录 -

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

以下命令与.git目录一起拉链,但文件夹太大了 -

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

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

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

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

这意味着“查看此目录中包含的所有内容,如果它是一个目录并且包含名为.git 的目录,而不是顶级目录,请不要进入该目录,否则打印出文件名“。

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

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

接受stdin上的文件列表(-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有助于避免这种情况。

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

答案 1 :(得分:0)

使用

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

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

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

答案 2 :(得分:0)

如果您的git信息库目录包含未版本控制的文件,并且您不想将其包含在zip文件中,则更简单的选择是将信息库git clone到新目录,然后压缩整个目录。