svn 自動忽略文件腳本 (Android Studio)

一.背景

使用習慣git,用回svn在Android Studio中忽略文件很差使,因此本身擼一個腳本插件來實現自動化忽略svn中的文件。android

ps:在網上找過好多文章,幾乎千篇一概都是說在commit提交後就沒法配置,本文給出解決方案。git

二.解決方案

svn的忽略文件以安卓項目爲例,要忽略如下文件或者文件夾。bash

*.iml
.idea/
/.gradle
gradle/
gradlew
gradlew.bat
local.properties
# 各個模塊下build文件夾
app/build/
複製代碼

使用git很容易配置忽略規則,在項目.gitignore文件中根據需求寫入相應配置便可,可是使用svn狀況下是沒法根據配置文件忽略文件,只能在配置中添加忽略規則。app

2.1 Ignored Files 配置

在Android Studio中setting -> Version Control -> Ignored Files 中配置。ide

but,每次checkout svn上的工程項目都須要從新配置,本着程序是來提升效率的,想着可不能夠編寫腳本使整個自動配置。svn

配置svn忽略規則

2.2 Ignored Files 原理

在Android Studio 配置 Ignored Files 規則後在項目根目錄.idea/workspace.xml文件<component name="ChangeListManager"> 裏面保存添加的忽略規則。gradle

svn忽略規則保存文件

2.3 Ignored Files 自動化

so,咱們只要在workspace.xml添加相應字段便可達到在setting中配置忽略規則的效果。ui

import groovy.xml.XmlUtil
def ignoreSvn() {
    try {
        def ignoredMap = [
                ["name": "path", value: ".idea/"],
                ["name": "path", value: ".gradle/"],
                ["name": "path", value: "gradle/"],
                ["name": "path", value: "build/"],
                ["name": "path", value: "gradlew"],
                ["name": "path", value: "gradlew.bat"],
                ["name": "path", value: "local.properties"],
                ["name": "mask", value: "*.iml"],
        ]
        rootDir.list().each { if (file("$rootDir/$it/build").exists()) { ignoredMap.add(["name": "path", "value": "$it/build/"]) } }
        File workspaceFile = file("$rootDir/.idea/workspace.xml")
        def workspace = new XmlParser().parseText(workspaceFile.getText())
        def changeListManager = workspace.component.find { it.attribute("name") == "ChangeListManager" }
        if (changeListManager == null) { changeListManager = workspace.appendNode("component", ["name": "ChangeListManager"]) }
        ignoredMap.each {
            def ignoredNode = changeListManager.ignored.find { ignoredNode -> ignoredNode.attribute(it.name) == it.value }
            if (ignoredNode == null) { changeListManager.appendNode("ignored", ["${it.name}" : "${it.value}"]) }
        }
        PrintWriter pw = new PrintWriter(workspaceFile)
        pw.write(XmlUtil.serialize(workspace))
        pw.close()
    } catch (Exception e) { println "svn ignore error, meesage = ${e.message}" }
}
ignoreSvn()
複製代碼
2.4 腳本使用

將上面腳本複製到項目根目錄build.gradle中底部便可實現自動配置svn忽略規則,每次同步gradle都會檢查規則並配置。google

其中腳本中ignoreMap保存了忽略規則,path描述目錄和文件,mask只能描述文件(這一點比不上.gitignore)idea

注意:因爲腳本在build.gradle中配置階段執行,這是修改workspace.xml文件是沒法當即生效,須要gradle sync now同步一遍才生效。

三. svn忽略規則插件

插件已經編寫完成,按照一下在根目錄build.gradle配置便可。

  1. repositories添加jcenter()
  2. dependencies添加classpath 'com.owm.svn:ignore:1.0.2'
  3. build.gradle頂部應用插件apply plugin: 'com.owm.svn.ignore'
apply plugin: 'com.owm.svn.ignore'

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2'
        classpath 'com.owm.svn:ignore:1.0.2'
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}
複製代碼

將gradle 同步兩下就能夠了。

相關文章
相關標籤/搜索