据外媒 BleepingComputer
报道,Git
项目组于前两天公布了一个在 Git 命令行客户端、Git Desktop 和 Atom
中发现的任意代码执行漏洞,这是一个比较严重的安全漏洞,可能会使得恶意仓库在易受攻击的计算机上远程执行命令。

澳门新葡萄京官网首页 1

git
的工作就是创建和保存你的项目的快照及与之后的快照进行比较。本文将对有关创建与提交项目的快照的命令作介绍。

这个漏洞已被分配 CVE-2018-17456 这个唯一 ID,与之前的 CVE-2017-1000117
可选注入漏洞相似 —— 恶意仓库可以新建一个 .gitmodules
文件,其中包含以破折号开头的 URL
澳门新葡萄京官网首页 ,。

理解仓库(或者说是数据库)和文件关系

获取与创建项目的命令

通过破折号,当 Git 使用 –recurse-submodules
参数来克隆仓库时,该命令会将 URL
翻译为一个选项,然后可以使用该选项在计算机上进行远程代码执行。

澳门新葡萄京官网首页 2

git init 

当运行 “git clone –recurse-submodules” 时,Git 会解析 .gitmodules
文件中的 URL 字段,然后将其作为参数传递给 “git clone” 子进程。如果 URL
字段是一个字符串,并使用短划线开头,这个 “git clone” 子进程将会把 URL
翻译为一个选项。这可能导致用户运行 “git clone” 时,会执行 superproject
中的任意脚本。

理解远程数据库和本地数据库,以及推和拉关系

用 git init在目录中创建新的Git
仓库。你可以在任何时候,任何目录中这么做,完全是本地化的。

下面通过一个例子进行说明,下面的漏洞使用了恶意的 .gitmodules
文件(注意 URL 如何以破折号开头),以使得 Git 认为这是一个选项。然后
“touch VULNERABLE/git@github.com:/timwr/test.git” 这条命令将会被执行。

澳门新葡萄京官网首页 3

在目录中执行git
init,就可以创建一个Git仓库了。比如我们创建test项目:

[submodule "test"]
    path = test
    url = ssh://-oProxyCommand=touch VULNERABLE/git@github.com:/timwr/test.git

本地数据库的创建

$ mkdir test

此漏洞已在 Git v2.19.1 (with backports in v2.14.5, v2.15.3, v2.16.5,
v2.17.2, and v2.18.1), GitHub Desktop 1.4.2, Github Desktop
1.4.3-beta0, Atom 1.31.2 和 Atom 1.32.0-beta3 中得到修复。

澳门新葡萄京官网首页 4

$ cd test

Git 项目组强烈建议所有用户升级到最新版本的 Git
client, Github
Desktop 或 Atom,以免遭受恶意仓库的攻击。

注解修改的规范

git init

(文/开源中国)    

澳门新葡萄京官网首页 5

澳门新葡萄京官网首页 6

要提交到数据库,先提交至索引

 

安装Git之后,请输入您的用户名和电子邮件地址。该设置操作在安装Git后进行一次就够了。这些信息将作为提交者信息显示在更新历史中。

现在你可以看到在你的项目目录中有个.git的子目录。这就是你的Git仓库了,所有有关你的项目的快照数据都存在这里。

澳门新葡萄京官网首页 7

 

git config –global

git clone 

澳门新葡萄京官网首页 8

使用git clone 拷贝一个git
仓库到本地,让自己能够查看该项目,或者进行修改。

用git init命令,把任意位置的目录纳入数据库中

如果你需要与他人合作一个项目,或者想要复制一个项目,看看代码,你就可以克隆那个项目。执行命令:

澳门新葡萄京官网首页 9

git clone [url]

将目录中的文件加入到索引里

[url]为你想要复制的项目,就可以了。

澳门新葡萄京官网首页 10

例如我们克隆Github上的项目:

将目录下所有文件加入到索引

澳门新葡萄京官网首页 11

澳门新葡萄京官网首页 12

 

add和status命令

例如我们要克隆Github上的项目:

澳门新葡萄京官网首页 13

$ git clone git://github.com/schacon/simplegit.git

commit命令,后面跟着string

默认情况下,Git会按照你提供的URL所指示的项目的名称创建你的本地项目目录。通常就是该URL最后一个/之后的项目名称。如果你想要一个不一样的名字。你可以在该命令后加上你想要的名称。

澳门新葡萄京官网首页 14

基本快照

log命令查看提交记录

git
的工作就是创建和保存你的项目的快照及与之后的快照进行对比。本章将对有关创建与提交的快照的命令介绍.

澳门新葡萄京官网首页 15

git add 

推送,使得远程仓库和本地仓库保持修改的同步

git add 命令可将该文件添加到缓存。

澳门新葡萄京官网首页 16

git status 命令用于查看项目的当前状态。

拉取

git diff 

  • github的核心是开源的版本控制系统VCS, git.
  • Linux原生自带了git.
  • 如果不想用命令行, 可以下载图形界面的客户端Github Desktop,
    但是还是用命令行能够知道本质上进行了什么操作.
    如果你不需要处理本地的文件,那么在浏览器上通过github网站就能处理包括

执行git diff 来查看执行git status的结果的详细信息

  1. 创建仓库
  2. 复刻仓库
  3. 管理文件
  4. 社交
    等一系列动作

git diff 命令显示已写入缓存与修改但尚未写入缓存的区别。git diff
有两个主要的应用场景。

创建仓库

项目住在仓库里面, 点+号即可创建, 然后跟着wizard走即可

尚未缓存的改动 git diff

复刻仓库

一个fork就是仓库的一个副本,复刻一个仓库使得你可以在原项目上自由地实验,
而不影响原项目.
一般而言,复刻要么用于改造别人的项目,要么用别人的项目作为自己想法的起点.

查看已缓存的改动:git diff –cached

为别人的项目做改变

比如帮别人改bug. 相较于提一个issue, 你可以

  1. 复刻项目
  2. 做修改
  3. 提交拉请求(pull request)
    如果项目的所有者欣赏你的工作, 他们可能会将你的修正拉入原来的仓库里.

查看已缓存的与未缓存的所有改动: git diff HEAD

用别人的项目作为你自己想法的起点

开源的核心想法就是, 通过共享代码, 我们可以创造更好更可靠的软件.

显示摘要而非整个diff :git diff –stat

保持你的复刻同步

假设现在你已经复刻了一个别人的仓库,
但你在你本地电脑里还没有仓库里的文件.

git commit

在本地创建一个你复刻的克隆.

  1. 点Clone or download
  2. 复制克隆URL
  3. 打开终端
  4. git clone URL

https://help.github.com

使用 git add 命令将想要的快照的内容写入了缓存,而执行git commoit
记录缓存区的快照。

Git
为你的每一个提交都记录你的名字与电子邮件地址,所以第一步需要配置用户名和邮箱地址。

$ git config –global user.name ‘test’

$ git config –global user.email test@163.com

接下来我们写入缓存,并提交对文件的改动。在首个例子中,我们使用-m
选项在命令行中提供提交的注释。

$git add 

$ git status -s 

$ git commit -m ‘test’

现在我们已经记录了快照 了。如果我们再执行git status:

查看上次提交是否有修改。

如果你没有设置-m选项 ,git
会尝试为你打开一个编辑器以填写提交信息。如果Git在你对它的配置中找不到相关信息,默认会打开vim,屏幕会像这样:

#Please enter the commit message for your changes. Lines starting #
will be igored,and an empty message aborts the commit.#On 

branch master #(user “git reset HEAD…” to unstage) 

如果你觉得git add 提交缓存的流程太繁琐,Git 也允许你使用-a
选项跳过这一步。命令格式如下:

git commit -a 

如:

$ git commit -am ‘modify config’

 

git reset HEAD 

git reset HEAD命令用于取消已缓存的内容。

git rm 

git rm 将文件从缓存区中移除

默认情况下,git rm file
会将文件从缓存区和你的硬盘(工作目录)删除。如果要在工作目录中留着该文件,可以使用命令:

git rm –cached

git mv 

git mv 命令做得所有的事情就是git rm –cached
,重命名磁盘上的文件,然后执行git add
把新文件添加到缓存区。因此,虽然有git mv命令,但它有点多余。