1. 概述
在维护android代码时,如果有大量修改,比方合入google释放的patch,将可能会有几十个git库同时提交,挨个来太费事了,可以根据repo status命令生成的结果进行整体提交
repo结果一般如下形式:
project frameworks/base/packages/SettingsLib/
-m res/xml-ar/timezones.xml
-m res/xml-ur-rPK/timezones.xml
project frameworks/base/packages/SystemUI/
-m src/com/android/systemui/recents/RecentsActivity.java
project frameworks/base/services/
-m core/java/com/android/server/pm/PackageManagerService.java
-m core/java/com/android/server/wm/DimLayerController.java
我们把repo status的结果放到文件multi_commit_projects.txt中
2. 生成提交命令思路:
我们把每个git库的project名称提取出来,然后拼接成
repo forall frameworks/base/packages/SettingsLib frameworks/base/packages/SystemUI frameworks/base/services -c git add -A这种形式,就能多个库一起提交了
当然还包括,commit和push的过程
3. 写python脚本:
import os
'''
function definition area
'''
def getProjectList():
fileproject = open("multi_commit_projects.txt")
fileproject.seek(0)
space = ' '
targetStr = ""
excludeProject = "vendor/mediatek/proprietary/packages/apps/EngineerMode"
for line in fileproject:
if line.startswith("project ") and (not excludeProject in line):
#print(line)
firstIndex = -1
secondIndex = -1
index = 0
for char in line:
if char == space:
if secondIndex != -1:
break;
if firstIndex == -1:
firstIndex = index+1
#print(firstIndex)
else:
secondIndex = index-1
#print(secondIndex)
index += 1
prjname = line[firstIndex:secondIndex]
#print prjname
targetStr += ' '
targetStr += prjname
targetStr += ' '
targetStr += excludeProject
targetStr += ' '
print(targetStr)
return targetStr
def getCommand(prefix, projects, postfix):
#prefix = "repo forall"
#postfix = "-c git add -A"
return (prefix+projects+postfix)
def getAllCommand():
prefix = "repo forall"
addComand = "-c git add -A"
commitCommand = "-c git commit -m \'"
pushCommand = "-c \'git push $REPO_REMOTE HEAD:refs/for/$REPO_RREV\'"
projects = getProjectList()
strCommand = ""
strCommand += "\n\n"
strCommand += getCommand(prefix, projects, addComand)
strCommand += "\n\n\n"
strCommand += getCommand(prefix, projects, commitCommand)
strCommand += "\n\n\n"
strCommand += getCommand(prefix, projects, pushCommand)
strCommand += "\n\n"
return strCommand
'''
start run form here
'''
writefile = file("commit_command.txt", "w")
writefile.write(getAllCommand())
writefile.flush()
writefile.close()
4. 生成结 果将保存在commit_command.txt中,内容大致如下:
repo forall frameworks/base/packages/SettingsLib frameworks/base/packages/SystemUI frameworks/base/services vendor/mediatek/proprietary/packages/apps/EngineerMode -c git add -A
repo forall frameworks/base/packages/SettingsLib frameworks/base/packages/SystemUI frameworks/base/services vendor/mediatek/proprietary/packages/apps/EngineerMode -c git commit -m '
repo forall frameworks/base/packages/SettingsLib frameworks/base/packages/SystemUI frameworks/base/services vendor/mediatek/proprietary/packages/apps/EngineerMode -c 'git push $REPO_REMOTE HEAD:refs/for/$REPO_RREV'
大功告成!