Gradle使用.git文件夹解压缩存档

时间:2016-04-20 12:11:12

标签: gradle

使用Gradle 2.11JVM 1.8.0_77

ziptree的Gradle复制任务似乎不喜欢zip-trees中的点文件夹,因为它完全忽略了.git文件夹:

Archive.zip:

archive/someFile
archive/.manifest
archive/.git/objects/93/
archive/.git/objects/93/c426c3ffd836bfc0af36e6fd97a72b7b4f67be
archive/.git/objects/info/
archive/.git/objects/aa/

Gradle任务

task unzip(type: Copy) {
  def zipFile = file("archive.zip")
  from zipTree(zipFile)
  into workingDir
}

结果:

> $ gradle unzip
> $ find archive/.

archive/someFile
archive/.manifest

使用像include '**/.git'这样的东西似乎也不起作用。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

Gradle复制任务使用ant的DirectoryScanner,它附带了一系列默认排除项,包括**/.git**/.git/**。有关默认排除的完整列表,请参阅本文的底部。请参阅当前打开且未解决的缺陷GRADLE-1883

您可以通过从中删除git条目来自定义默认排除列表,但任务中的任何更改都会影响后续复制任务,这可能会导致任务下坡的潜在问题。

该缺陷页面上建议的(相当难看的)安全解决方法是删除任务中的默认排除项,并在退出任务之前重置排除项。

import org.apache.tools.ant.DirectoryScanner

task unzip(type: Copy) {
    doFirst {
      DirectoryScanner.defaultExcludes.each { DirectoryScanner.removeDefaultExclude it }
      DirectoryScanner.addDefaultExclude 'something has to be in here or everything gets excluded'
    }

    doLast {
      DirectoryScanner.resetDefaultExcludes()
    }

    def zipFile = file("archive.zip")
    from zipTree(zipFile)
    into workingDir
}

Ant默认排除模式:

**/%*%             
**/.git/**         
**/SCCS            
**/.bzr            
**/.hg/**          
**/.bzrignore      
**/.git            
**/SCCS/**         
**/.hg             
**/.#*             
**/vssver.scc      
**/.bzr/**         
**/._*             
**/#*#             
**/*~              
**/CVS             
**/.hgtags         
**/.svn/**         
**/.hgignore       
**/.svn            
**/.gitignore      
**/.gitmodules     
**/.hgsubstate     
**/.gitattributes  
**/CVS/**          
**/.hgsub          
**/.DS_Store       
**/.cvsignore      

答案 1 :(得分:0)

前段时间,我有同样的问题,但没有解压缩,而是拉链。到那个时候我找不到这个解决方案,并且不知道如何在gradle中修复“默认排除”的事情。我从ant找到了相同的解决方案,并使用ant任务创建了一个包含“default excluded .git”目录的ZIP。我正在为那些可能觉得有用的人粘贴我的解决方法。

task createZip << {
    description 'Creates a zip file under build folder'
    ant.zip(destfile: filename) {
        fileset(dir: projectDir, defaultexcludes: 'no') {
            exclude(name: '*.zip, build/**, gradle/**, gradlew*, .idea/**')
    }
}

我刚刚复制了代码片段,filename是一个在构建文件的另一部分中赋值的变量。我有一个排除列表,如果需要,您可以拥有自己的列表。唯一要提到的是:如何在gradle任务中调用ant任务,然后将“defaultExcludes”参数设置为NO以达到目的。