ABAP-动态创建DATABASE/FUNCTION(风险)
警告:此程序仅供研究,请谨慎操作,切勿对系统标准数据表及功能函数进行测试(可能无法修复)。
程序:EWUCINS
REPORT EWUCINS MESSAGE-ID US NO STANDARD PAGE HEADING.
* Administrieren Cluster und parallele Tasks
PARAMETERS: TESTRUN DEFAULT 'X', "test B(reak), C(alled)
P_FKT() DEFAULT 'SIZ'."SIZ,INS,DEL
TABLES: TAORA, TAINF.
DATA: H_RUNTI TYPE F.
DATA: BEGIN OF T_DBAFREE OCCURS ,
NAME(),
BYTES TYPE I,
END OF T_DBAFREE,
H_TABNAME LIKE DD02L-TABNAME VALUE 'EWUCLU'.
DATA: BEGIN OF T_DBAONLINE OCCURS ,
NAME(),
STATUS(),
END OF T_DBAONLINE.
DATA: RC LIKE SY-SUBRC.
AT SELECTION-SCREEN OUTPUT.
*f sy-subty = '04'. "dialog
IF TESTRUN <> 'C'. "dialog
P_FKT = 'SIZ'.
ENDIF.
START-OF-SELECTION.
*******************************************************
* Write out Parameters
*******************************************************
PERFORM WRITE_PARMS.
GET RUN TIME FIELD H_RUNTI.
************************************************************************
* functions
************************************************************************
CASE P_FKT.
* available freespace in db ------------------------------------------*
WHEN 'SIZ'.
IF SY-DBSYS = 'ORACLE'
OR SY-DBSYS = 'INFORMIX'.
PERFORM SEL_DBAFREE.
ELSE.
* installation --------------------------------------------------------*
* when 'INS'.
TAORA-TABART = 'APPL0'.
PERFORM CREATE_TABLE.
PERFORM CREATE_FUNCTION.
ENDIF.
* drop ewuclu --------------------------------------------------------*
WHEN 'DEL'.
PERFORM DELETE_TABLE.
ENDCASE.
GET RUN TIME FIELD H_RUNTI.
* IF testrun = 'B'. BREAK-POINT. ENDIF.
WRITE: / 'runtime:', H_RUNTI,
/ 'endtime:', SY-UZEIT.
COMMIT WORK.
IF TESTRUN = 'C'. LEAVE PROGRAM. ENDIF. "called
STOP.
*----------------------------------------------------------------------*
AT LINE-SELECTION.
T_DBAFREE-name = SY-LISEL().
WRITE: / T_DBAFREE-NAME, 'wurde ausgewählt'().
PERFORM FIND_TABLE_DETAIL.
PERFORM CREATE_TABLE.
PERFORM CREATE_FUNCTION.
*----------------------------------------------------------------------*
FORM APPEND_DBAFREE.
IF SY-SUBRC = . APPEND T_DBAFREE. ENDIF.
ENDFORM.
FORM APPEND_DBAONLINE.
IF SY-SUBRC = . APPEND T_DBAONLINE. ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
FORM SEL_DBAFREE.
CASE SY-DBSYS.
WHEN 'ORACLE'.
EXEC SQL PERFORMING APPEND_DBAFREE.
SELECT TABLESPACE_NAME, SUM(NVL(BYTES,))/
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME INTO :T_DBAFREE
ENDEXEC.
EXEC SQL PERFORMING APPEND_DBAONLINE.
SELECT TABLESPACE_NAME, STATUS
FROM DBA_TABLESPACES
INTO :T_DBAONLINE
ENDEXEC.
LOOP AT T_DBAONLINE.
IF T_DBAONLINE-STATUS = 'OFFLINE'.
DELETE T_DBAFREE WHERE NAME = T_DBAONLINE-NAME.
ENDIF.
ENDLOOP.
WHEN 'INFORMIX'.
PERFORM LISTE_DBSPACES_CREATE.
WHEN OTHERS.
WRITE: / 'DB not implemented'. STOP.
ENDCASE.
SORT T_DBAFREE BY BYTES DESCENDING.
IF TESTRUN <> 'C'.
LOOP AT T_DBAFREE.
IF SY-TABIX = .
WRITE: / 'Tablespace', 'Freespace(KB)'.
ENDIF.
WRITE: / T_DBAFREE-NAME, T_DBAFREE-BYTES.
ENDLOOP.
* automatically find biggest freespace
ELSE.
LOOP AT T_DBAFREE.
IF T_DBAFREE-NAME() <> 'PSAPROLL'
AND T_DBAFREE-NAME() <> 'PSAPTEMP'
AND T_DBAFREE-NAME() <> 'SYSTEM'.
PERFORM FIND_TABLE_DETAIL.
PERFORM CREATE_TABLE.
PERFORM CREATE_FUNCTION.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
FORM FIND_TABLE_DETAIL.
* tabellenart (appl0) bestimmt tablespace/dbspace
CASE SY-DBSYS.
WHEN 'ORACLE'.
SELECT SINGLE * FROM TAORA WHERE TABSPACE = T_DBAFREE-NAME.
WHEN 'INFORMIX'.
TAINF-DBSPACES = T_DBAFREE-NAME.
TRANSLATE TAINF-DBSPACES TO UPPER CASE. "#EC TRANSLANG
SELECT SINGLE * FROM TAINF WHERE DBSPACES = TAINF-DBSPACES.
TAORA-TABART = TAINF-TABART.
ENDCASE.
IF SY-SUBRC <> .
* write: / 'tabart not found'.
* exit.
TAORA-TABART = 'APPL0'.
IF SY-DBSYS = 'ORACLE'.
DATA: PROG() OCCURS WITH HEADER LINE.
TABLES: DD02L.
PROG = 'report x. '. APPEND PROG.
PROG = 'tables: dd02ora. '. APPEND PROG.
IF SY-SAPRL >= '31I'.
PROG = 'tables: ddstorage. '. APPEND PROG.
ENDIF.
PROG = 'form insert_dd02ora. '. APPEND PROG.
CONCATENATE 'dd02ora-tabname = ''' H_TABNAME '''.' INTO PROG.
APPEND PROG.
CONCATENATE 'delete from dd02ora where tabname = '''
H_TABNAME '''.' INTO PROG.
APPEND PROG.
PROG = 'dd02ora-source = ''USR''. '. APPEND PROG.
PROG = 'dd02ora-useflag = ''X''. '. APPEND PROG.
CONCATENATE 'dd02ora-tabspace = ''' T_DBAFREE-NAME '''.' INTO PROG.
APPEND PROG.
PROG = 'dd02ora-init = ''''. '. APPEND PROG.
PROG = 'dd02ora-next = ''''. '. APPEND PROG.
PROG = 'dd02ora-minext = ''''. '. APPEND PROG.
PROG = 'dd02ora-maxext = ''''. '. APPEND PROG.
PROG = 'dd02ora-pctinc = ''''. '. APPEND PROG.
PROG = 'dd02ora-ofreelist = ''''. '. APPEND PROG.
PROG = 'dd02ora-ofreegroup = ''''. '. APPEND PROG.
PROG = 'dd02ora-opctfree = ''''. '. APPEND PROG.
PROG = 'dd02ora-opctused = ''''. '. APPEND PROG.
PROG = 'insert dd02ora. '. APPEND PROG.
PROG = 'endform. '. APPEND PROG.
DATA: H_GENPROG LIKE TRDIR-NAME.
* break-point.
GENERATE SUBROUTINE POOL PROG NAME H_GENPROG MESSAGE PROG.
PERFORM INSERT_DD02ORA IN PROGRAM (H_GENPROG).
ENDIF.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
FORM CREATE_TABLE.
DATA: I_DD02V_WA LIKE DD02V,
I_DD09L_WA LIKE DD09L,
I_DD03P_TAB LIKE DD03P OCCURS WITH HEADER LINE.
* Header
I_DD02V_WA-TABNAME = H_TABNAME.
I_DD02V_WA-DDLANGUAGE = 'D'.
I_DD02V_WA-DDTEXT = '_conv_ Cluster'.
I_DD02V_WA-TABCLASS = 'TRANSP'.
I_DD02V_WA-CONTFLAG = 'L'.
* Technical Settings
I_DD09L_WA-TABNAME = H_TABNAME.
I_DD09L_WA-TABKAT = ''.
I_DD09L_WA-TABART = TAORA-TABART.
*_dd09l_wa-bufalow = 'N'.
* Fields
I_DD03P_TAB-TABNAME = H_TABNAME.
I_DD03P_TAB-DDLANGUAGE = 'D'.
I_DD03P_TAB-FIELDNAME = 'MANDT'.
I_DD03P_TAB-POSITION = ''.
I_DD03P_TAB-KEYFLAG = 'X'.
I_DD03P_TAB-DATATYPE = 'CLNT'.
I_DD03P_TAB-LENG = ''.
APPEND I_DD03P_TAB.
I_DD03P_TAB-FIELDNAME = 'RELID'.
I_DD03P_TAB-POSITION = ''.
I_DD03P_TAB-KEYFLAG = 'X'.
I_DD03P_TAB-DATATYPE = 'CHAR'.
I_DD03P_TAB-LENG = ''.
APPEND I_DD03P_TAB.
I_DD03P_TAB-FIELDNAME = 'UMSID'.
I_DD03P_TAB-POSITION = ''.
I_DD03P_TAB-KEYFLAG = 'X'.
I_DD03P_TAB-DATATYPE = 'CHAR'.
I_DD03P_TAB-LENG = ''.
APPEND I_DD03P_TAB.
I_DD03P_TAB-FIELDNAME = 'PAGENO'.
I_DD03P_TAB-POSITION = ''.
I_DD03P_TAB-KEYFLAG = 'X'.
I_DD03P_TAB-DATATYPE = 'INT4'.
I_DD03P_TAB-LENG = ''.
APPEND I_DD03P_TAB.
I_DD03P_TAB-FIELDNAME = 'CLUSTR'.
I_DD03P_TAB-POSITION = ''.
I_DD03P_TAB-KEYFLAG = ' '.
I_DD03P_TAB-DATATYPE = 'INT2'.
I_DD03P_TAB-LENG = ''.
APPEND I_DD03P_TAB.
I_DD03P_TAB-FIELDNAME = 'CLUSTD'.
I_DD03P_TAB-POSITION = ''.
I_DD03P_TAB-KEYFLAG = ' '.
I_DD03P_TAB-DATATYPE = 'LRAW'.
I_DD03P_TAB-LENG = ''.
APPEND I_DD03P_TAB.
CALL FUNCTION 'DDIF_TABL_PUT'
EXPORTING
NAME = H_TABNAME
DD02V_WA = I_DD02V_WA
DD09L_WA = I_DD09L_WA
TABLES
DD03P_TAB = I_DD03P_TAB
* DD05M_TAB =
* DD08V_TAB =
EXCEPTIONS
TABL_NOT_FOUND =
NAME_INCONSISTENT =
TABL_INCONSISTENT =
PUT_FAILURE =
PUT_REFUSED =
OTHERS = .
IF SY-SUBRC <> .
MESSAGE e306(mq) WITH text-. "'Table create error'.
ENDIF.
CALL FUNCTION 'DDIF_TABL_ACTIVATE'
EXPORTING
NAME = H_TABNAME
AUTH_CHK = 'X'
* PRID = -1
IMPORTING
RC = RC
EXCEPTIONS
NOT_FOUND =
PUT_FAILURE =
OTHERS = .
IF SY-SUBRC <> OR RC = .
MESSAGE E341(MQ).
LEAVE PROGRAM.
ENDIF.
CALL FUNCTION 'TRINT_TADIR_INSERT'
EXPORTING
* AUTHOR = SY-UNAME
* MASTERLANG = ' '
DEVCLASS = 'ECLU'
* GENFLAG = ' '
OBJECT = 'TABL'
OBJ_NAME = 'EWUCLU'
PGMID = 'R3TR'
SRCSYSTEM = 'SAP'
* IMPORTING
* ES_TADIR =
EXCEPTIONS
OBJECT_EXISTS_GLOBAL =
OBJECT_EXISTS_LOCAL =
OTHERS = .
IF SY-SUBRC = .
MESSAGE e306(mq) WITH text-. "'tadir insert error'
ENDIF.
* SUBMIT EWUCADM
* WITH TESTRUN = 'X'
* WITH P_FKT = 'DIR'
* WITH P_MAXTSK = ' '
* WITH P_PROG = ' '
* WITH P_BATCH = ' '
* WITH P_RELID = ' '
* WITH P_CLUSIZ = ' '.
ENDFORM.
*----------------------------------------------------------------------*
FORM DELETE_TABLE.
CALL FUNCTION 'DB_DROP_TABLE'
EXPORTING
* DBSYS = SY-DBSYS
* NO_EXEC = ' '
* PRID = 0
* PROGNAME = ' '
TABNAME = 'EWUCLU'
* DB_CHECK_FLAG = ' '
* IMPORTING
* GENPROG =
* SUBRC =
EXCEPTIONS
PROGRAM_NOT_GENERATED =
PROGRAM_NOT_WRITTEN =
TABLE_NOT_DROPPED =
OTHERS = .
IF SY-SUBRC <> . MESSAGE e306(mq) WITH text-. ENDIF.
CALL FUNCTION 'DD_TABL_DEL'
EXPORTING
TABNAME = 'EWUCLU'
DEL_STATE = 'A'
* PRID = 0
EXCEPTIONS
OTHERS = .
IF SY-SUBRC <> . MESSAGE e306(mq) WITH text-. ENDIF.
CALL FUNCTION 'TRINT_TADIR_DELETE'
EXPORTING
OBJECT = 'TABL'
OBJ_NAME = 'EWUCLU'
PGMID = 'R3TR'
EXCEPTIONS
TADIR_ENTRY_NOT_EXISTING =
OBJECT_EXISTS =
OTHERS = .
IF SY-SUBRC = . MESSAGE e306(mq) WITH text- . ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
FORM CREATE_FUNCTION.
CALL FUNCTION 'FUNCTION_POOL_CREATE'
EXPORTING
POOL_NAME = 'ZCNV'
* RESPONSIBLE = SY-UNAME
SHORT_TEXT = '_conversion_'
* NAMESPACE = ' '
EXCEPTIONS
NAME_ALREADY_EXISTS =
NAME_NOT_CORRECT =
OTHERS = .
IF SY-SUBRC <> AND SY-SUBRC <> .
MESSAGE e306(mq) WITH text-. "Function pool error
ENDIF.
DATA: I_RSEXC LIKE RSEXC OCCURS WITH HEADER LINE.
DATA: I_RSEXP LIKE RSEXP OCCURS WITH HEADER LINE.
DATA: I_RSIMP LIKE RSIMP OCCURS WITH HEADER LINE.
DATA: I_RSFSO LIKE RSFSO OCCURS WITH HEADER LINE.
DATA: I_RSTBL LIKE RSTBL OCCURS WITH HEADER LINE.
DATA: I_RSCHA LIKE RSCHA OCCURS WITH HEADER LINE.
TABLES: RS38L.
I_RSIMP-PARAMETER = 'TESTRUN'.
I_RSIMP-DBFIELD = 'TRDIR-SQLX'.
APPEND I_RSIMP.
I_RSIMP-PARAMETER = 'PROGNAME'.
I_RSIMP-DBFIELD = 'TRDIR-NAME'.
APPEND I_RSIMP.
I_RSIMP-PARAMETER = 'FUNKTION'.
I_RSIMP-DBFIELD = 'TRDIR-TYPE'.
APPEND I_RSIMP.
I_RSIMP-PARAMETER = 'UMSID'.
I_RSIMP-DBFIELD = 'EWUCLU-UMSID'.
APPEND I_RSIMP.
I_RSIMP-PARAMETER = 'UMSI2'.
I_RSIMP-DBFIELD = 'EWUCLU-UMSID'.
APPEND I_RSIMP.
I_RSIMP-PARAMETER = 'TSKNO'.
I_RSIMP-DBFIELD = 'EWUCLU-RELID'.
APPEND I_RSIMP.
I_RSIMP-PARAMETER = 'RELID'.
I_RSIMP-DBFIELD = 'EWUCLU-RELID'.
APPEND I_RSIMP.
I_RSIMP-PARAMETER = 'CLUSIZ'.
I_RSIMP-DBFIELD = 'TRDIR-NAME'.
APPEND I_RSIMP.
CALL FUNCTION 'FUNCTION_CREATE'
EXPORTING
* CORRNUM = ' '
FUNCNAME = 'Z_SUB_PROG'
FUNCTION_POOL = 'ZCNV'
* INTERFACE_GLOBAL = ' '
REMOTE_CALL = 'X'
SHORT_TEXT = '_conversion_'
* SUPPRESS_CORR_CHECK = 'X'
* UPDATE_TASK = ' '
IMPORTING
FUNCTION_INCLUDE = RS38L-INCLUDE
TABLES
EXCEPTION_LIST = I_RSEXC
EXPORT_PARAMETER = I_RSEXP
IMPORT_PARAMETER = I_RSIMP
PARAMETER_DOCU = I_RSFSO
TABLES_PARAMETER = I_RSTBL
CHANGING_PARAMETER = I_RSCHA
EXCEPTIONS
DOUBLE_TASK =
ERROR_MESSAGE =
FUNCTION_ALREADY_EXISTS =
INVALID_FUNCTION_POOL =
INVALID_NAME =
TOO_MANY_FUNCTIONS =
OTHERS = .
IF SY-SUBRC <> .
IF SY-SUBRC <> .
* write: / 'Irgendwas ist beim FUBA anlegen schiefgegangen', sy-subrc.
MESSAGE e306(mq) WITH text-.
ENDIF.
EXIT.
ENDIF.
DATA: BEGIN OF PROG OCCURS ,
LINE(),
END OF PROG.
* break-point.
READ REPORT RS38L-INCLUDE INTO PROG.
LOOP AT PROG.
IF PROG-LINE = ' '.
PROG-LINE = 'submit (progname)'. INSERT PROG INTO PROG.
PROG-LINE = 'with testrun = testrun '. INSERT PROG INTO PROG.
PROG-LINE = 'with p_fkt = funktion'. INSERT PROG INTO PROG.
PROG-LINE = 'with p_umsid = umsid '. INSERT PROG INTO PROG.
PROG-LINE = 'with p_umsi2 = umsi2 '. INSERT PROG INTO PROG.
PROG-LINE = 'with p_tskno = tskno '. INSERT PROG INTO PROG.
PROG-LINE = 'with p_relid = relid '. INSERT PROG INTO PROG.
PROG-LINE = 'with p_clusiz = clusiz '. INSERT PROG INTO PROG.
PROG-LINE = 'to sap-spool '. INSERT PROG INTO PROG.
PROG-LINE = 'without spool dynpro '. INSERT PROG INTO PROG.
PROG-LINE = 'and return. '. INSERT PROG INTO PROG.
EXIT.
ENDIF.
ENDLOOP.
INSERT REPORT RS38L-INCLUDE FROM PROG.
ENDFORM.
*----------------------------------------------------------------------*
FORM LISTE_DBSPACES_CREATE.
DATA: BUFSIZE TYPE I.
PERFORM GET_DB_PARAMETER(RSINF000) USING 'BUFFSIZE' BUFSIZE.
BUFSIZE = BUFSIZE / .
* exec sql performing makedbspaces.
* c.dbsnum,
* sum(c.chksize) * :bufsize ,
* into :dbspaces_chunks
EXEC SQL PERFORMING APPEND_DBAFREE.
SELECT D.NAME,
SUM(C.NFREE) * :BUFSIZE
FROM SYSMASTER:SYSDBSPACES D,
SYSMASTER:SYSCHUNKS C
WHERE C.DBSNUM = D.DBSNUM
GROUP BY C.DBSNUM, D.NAME
INTO :T_DBAFREE
ENDEXEC.
ENDFORM.
*---------------------------------------------------------------------*
FORM WRITE_PARMS.
WRITE: / 'testrun:', TESTRUN,
/ 'funktion:', P_FKT(),
/ 'time:', SY-UZEIT,
/ '--------------------------------------------------'.
ENDFORM.
ABAP-动态创建DATABASE/FUNCTION(风险)的更多相关文章
- bootstrap-multiselect 的简单使用,样式修改,动态创建option
1.bootstrap-multiselect 顾名思义基于bootstrap,bootstrap基于jquery,所以第一步,引入文件 bootstrap.css/ juery.js /bootst ...
- js动态创建和删除option
1.动态创建select function createSelect(){ var mySelect = document.createElement("select&q ...
- 动态创建selectjs 操作select和option
1.动态创建select function createSelect(){ var mySelect = document.createElement("select"); myS ...
- [SAP ABAP开发技术总结]反射,动态创建内表、结构、变量
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段
ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...
- js动态创建style节点(js文件中添加css)
ie6 不能 document.createElement('style') 然后append到head标签里.所以就找到这样个好文章 --------------------- 有很多提供动态创建 ...
- Unity进阶技巧 - 动态创建UGUI
前言 项目中有功能需要在代码中动态创建UGUI对象,但是在网上搜索了很久都没有找到类似的教程,最后终于在官方文档中找到了方法,趁着记忆犹新,写下动态创建UGUI的方法,供需要的朋友参考 你将学到什么? ...
- jQuery 绑定事件到动态创建的元素上
在进入主题之前,我们先来看一个前台页面经常用到的功能:点击页面输入框时自动选择其中文本. 很容易想到利用输入框的focus事件,当输入框获得焦点时,再调用jQuery的select()方法. Okay ...
- javascript学习笔记(四):事件处理函数和动态创建html标记。
1 HTML的事件属性 全局事件属性:HTML 4 增加了使事件在浏览器中触发动作的能力,比如当用户点击元素时启动 JavaScript. a. Window 事件属性,针对 window 对象触发 ...
随机推荐
- Cocos2D-X2.2.3学习笔记13(延时动作)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/q269399361/article/details/28265477 还记得我们上一节讲的瞬时动作吗 ...
- 产品思维&技术思维&工程思维
产品思维 产品思维的起源是用户(或客户)价值.用户价值是通过技术手段以产品或服务的形态去解决用户的痛点,或带去爽点.毫无疑问,工程师在日常工作中应时刻关注并理清自己的工作与用户(或客户)价值的联系,并 ...
- 【转】每天一个linux命令(8):cp 命令
原文网址:http://www.cnblogs.com/peida/archive/2012/10/29/2744185.html cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一 ...
- oracle之 redo过高诊断
一.诊断过度redo 要找到生成大量重做的会话,您可以使用以下任何一种方法.这两种方法都检查生成的撤销量.当一个事务生成撤销,它将自动生成重做. 当需要检查生成大量的程序时,使用第一个查询.当这些程序 ...
- FineUI与百度地图简单示例 (转帖)
http://www.fineui.com/bbs/forum.php?mod=viewthread&tid=4191&extra=page%3D1 前台代码 <%@ Page ...
- Git密钥生成步骤SSH Key
顺便推荐下自己的网站: 一个php后台极速开发框架 https://www.lotusadmin.top/ 一个有趣的网站 https://www.waytomilky.com/ Git是分布式的代码 ...
- msp430学习笔记-时钟及延时函数
引用:http://blog.chinaunix.net/uid-24343357-id-3271380.html MCLK默认时钟源是DCOCLK,SMCLK默认时钟源也是DCOCLK,DCOCLK ...
- linux 信号与多线程
在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别,可以说是完全不同.在进程环境中,对信号的处理是,先注册信号处理函数,当信号异步发生时,调用处理函数来处理信号.它完全是异步的( ...
- 【Active入门】ActiveMQ学习-1
基本概念: 接收者: package com.ll.activemq; import java.util.Collection; import java.util.Iterator; import j ...
- 杂项:GitHub
ylbtech-杂项:GitHub gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub. gitHub于2008年4月10日正式上线, ...