我正在尝试压缩包含.git
目录的git存储库目录。我试着在目录上做一个tar,但它创建了一个比原来更大的文件夹,因为它附加了所有的子模块。
我尝试了以下命令但是它们没有.git
目录 -
git archive master --format=tar --output="../gridImageSearch.zip"
以下命令与.git
目录一起拉链,但文件夹太大了 -
tar -zcvf ../blah.tar.gz blah
有什么建议吗?
答案 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
到新目录,然后压缩整个目录。