git 基础教程 (一) 创建、修改、提交

参考资料:
http://www.vogella.com/articles/Git/article.html

安装Git

Linux

在Ubuntu上较高版本有自带Git,当然也可以通过apt来安装git命令行工具

sudo apt-get install git-core

redhat/centOS 安装Git 可以参考 CentOS 5.8 安装 git

Windows

msysgit项目提供的:http://code.google.com/p/msysgit/
github for windows:http://windows.github.com/

Mac OS

Git for OS X : http://code.google.com/p/git-osx-installer

git 常见命令

# 安装好之后输入 git 回车
git
最常用的 git 命令有:
   add        添加文件内容至索引
   bisect     通过二分查找定位引入 bug 的变更
   branch     列出、创建或删除分支
   checkout   检出一个分支或路径到工作区
   clone      克隆一个版本库到一个新目录
   commit     记录变更到版本库
   diff       显示提交之间、提交和工作区之间等的差异
   fetch      从另外一个版本库下载对象和引用
   grep       输出和模式匹配的行
   init       创建一个空的 Git 版本库或重新初始化一个已存在的版本库
   log        显示提交日志
   merge      合并两个或更多开发历史
   mv         移动或重命名一个文件、目录或符号链接
   pull       获取并合并另外的版本库或一个本地分支
   push       更新远程引用和相关的对象
   rebase     本地提交转移至更新后的上游分支中
   reset      重置当前HEAD到指定状态
   rm         从工作区和索引中删除文件
   show       显示各种类型的对象
   status     显示工作区状态
   tag        创建、列出、删除或校验一个GPG签名的 tag 对象

配置

Git 允许我们在 .gitconfig 文件中保存全局设置. 这个文件位于用户的home目录. 每次提交都会保存作者和提交者的信息,这些信息都可以保存在全局配置中。

获取Git配置信息列表:

git config --list

配置用户名和Email

# 配置全局用户名
git config --global user.name "Alan"
# 配置全局email
git config --global user.email "your.email@gmail.com"
# 设置push的全局默认操作为 matcheing 即匹配的情况下不会用户的push
git config --global push.default "matching"
# 查看配置列表
git config --list

终端配置高亮

git config --global color.status auto
git config --global color.branch auto

设置默认编辑器
git会使用系统默认的编辑器,我们也可以手动设置这一选项

git config --global core.editor vim 

除了全局配置之外,用户每次新建的git仓库也有自己的局部配置,位于 当前git项目的 .git 目录下。所有的git设置选项都在这个手册中能找到: git 配置手册

创建 git 仓库

创建文件夹

首先需要一个存放仓库的文件夹,我们可以通过以下代码来创建

# 切换到 home 目录
cd ~/

# 创建一个存放的文件夹并切换到该目录下
mkdir ~/project_main
cd project_main

# create a new directory
mkdir datafiles 

创建 Git 仓库

每一个Git库在刚创建的时候就会初始化一个 .git 文件夹来保存这个资料库的完整的历史信息,在 .git/config 文件包含当前资料库的配置信息。

如下代码则是在当前文件夹中创建了一个 git 资料库

# 在当前文件夹下初始化一个 Git 资料库
git init 

输出:

初始化空的 Git 版本库于 /home/project_main/.git/

添加一些内容

# 切换到这个库下(刚刚init的文件夹)
cd ~/project_main

# 创建一些文件
touch test01
touch test02
touch test03
# 再来个文件夹
mkdir datafiles
touch datafiles/data.txt

# 使用 > 命令将 ls 命令的输出导入到test01中
ls > test01 

查看库状态

git status 命令可以显示工作树状态,也就是文件的改变(添加、删除、部分修改等等)。它可以显示文件的合并冲突(当前库与远程库不一致)并且就对于这些改变用户可以做的事情而提出建议,例如将更改添加到索引或者删除等等。

git status 

输出:

# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#       datafiles/
#       test01
#       test02
#       test03
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

添加文件到 Git 索引

在将修改提交到 Git 库之前,你需要通过添加(add)操作来mark出你想要提交到Git索引的改变。这实际上是一个暂时的提交列表, 如果你后来又改变了其中的某一个文件,不用担心,这还不是正式提交,你只需要再add一次来更新你的提交列表就可以了(与远程库交互的时候,这样可以节省很多不必要的麻烦)。

# 添加所有文件(夹)到当前 Git 库的索引(临时提交列表)
git add . 

接着可以再次运行 git status 命令来观察当前状态。

git status

输出:

# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached <file>..." 撤出暂存区)
#
#       新文件:    datafiles/data.txt
#       新文件:    test01
#       新文件:    test02
#       新文件:    test03
#
# 再添加一个文件
touch datafiles/data2.txt
# 查看状态
git status

输出:

# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached <file>..." 撤出暂存区)
#
#       新文件:    datafiles/data.txt
#       新文件:    test01
#       新文件:    test02
#       新文件:    test03
#
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#       datafiles/data2.txt

接着添加更改就是了:

git add datafiles/data2.txt

自己可以再通过 git status 查看一下临时提交列表。如果当前没有做任何修改,或者修改都已经提交那么这会显示:

git status
# 位于分支 master
无文件要提交,干净的工作区

正式提交到 Git 库

确定好了之后,你就可以正式提交了。这个操作会添加一个Git库中所有文件的快照。“-m”选项表示附加注释内容,如果你没有在命令中就使用 -m 附上注释,你的默认编辑器就会自动启动所以你也可以在编辑器中留下你想标注的信息。

# 正式提交变更到本地资料库 
# 同时附上标注信息 “项目初始化”
git commit -m "项目初始化" 

输出:

[master(根提交) ee4b843] 项目初始化
 Committer: root <root@localhost.localdomain>
您的姓名和邮件地址基于登录名和主机名进行了自动设置。请检查它们正确
与否。您可以通过下面的命令对其进行明确地设置以免再出现本提示信息:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

设置完毕后,您可以用下面的命令来修正本次提交所使用的用户身份:

    git commit --amend --reset-author

 5 files changed, 4 insertions(+)
 create mode 100644 datafiles/data.txt
 create mode 100644 datafiles/data2.txt
 create mode 100644 test01
 create mode 100644 test02
 create mode 100644 test03

好吧,这是一个小插曲。这个git是博主刚装的新版的,提示我添加名称和邮件了。当然,读者不要对此不以为然,当你一个人用git的时候这个可能不大重要,但是多人操作一个项目的时候名称标识可是很重要的,希望大家养成习惯配置好这些选项。

git config --global user.name "Lellansin"
git config --global user.email lellansin@gmail.com
# 没加 “-m” vim自动弹出来了 ":q"直接离开 (哈哈,博主又偷懒了)
git commit --amend --reset-author
[master 2401c44] 项目初始化
 5 files changed, 4 insertions(+)
 create mode 100644 datafiles/data.txt
 create mode 100644 datafiles/data2.txt
 create mode 100644 test01
 create mode 100644 test02
 create mode 100644 test03

查看你的 Git 库

操作日志

我们所做的所有操作都已建了一个 本地 Git 库保存在 .git文件夹中,其中还包括我们所正式提交到库中的的所有文件(夹)的快照。(注意只是本地的库,不一定与远程库同步)

# 查看 Git 操作日志
git log
# 以下是具体日志内容
# 其中的 Author(作者)还是博主刚刚临时改的(笑
commit 2401c44005fa2d81190c5105cfd164e490c71633
Author: Lellansin <lellansin@gmail.com>
Date:   Sun Apr 21 22:49:56 2013 +0800

    项目初始化

当日志比较长的时候(如果你有按着本例的做实验那么很可能马上就碰到),git log 查看日志时模式与vim有些类似,需要按“q”退出,上下箭头和翻页键可以翻页,通过“/string”和“?string”可以查找字符串“string”区别是一个向下、一个向上。

备注:如果一次都没有提交可能出现 “fatal: bad default revision ‘HEAD’” 这样的提示。

删除文件以及修改提交

如果你删除了一个文件,那么 “git add . ” 命令不会将该文件加入提交列表

你可以使用 git rm 命令来从你的工作目录中删除一个文件,并将这个删除操作添加到下一个提交列表中。

# 创建一个文件
touch delete_try.txt
# 添加到提交列表 并且同时("&&"操作) 提交这个列表
git add . && git commit -m "添加个文件来删删看 =。= "

# 可以翻下日志
git log

# 使用 Git 的移除命令
git rm delete_try.txt

# 提交这个移除操作
git commit -m "删掉了 delete_try.txt 文件"

# 日志君你好
git log

我们直接看最后的日志吧(日志君辛苦了):

commit d5a781496af0bfd5d856f7ea9bec452b83b184dd
Author: Lellansin <lellansin@gmail.com>
Date:   Sun Apr 21 23:29:13 2013 +0800

    删掉了 delete_try.txt 文件

commit d48fbf6a662b403f89c0bfba7fd811b7e86c3437
Author: Lellansin <lellansin@gmail.com>
Date:   Sun Apr 21 23:27:31 2013 +0800

    添加个文件来删删看 =。=

commit 2401c44005fa2d81190c5105cfd164e490c71633
Author: Lellansin <lellansin@gmail.com>
Date:   Sun Apr 21 22:49:56 2013 +0800

    项目初始化

或者你可以在使用 git commit 命令来提交的时候(git add 也是可以的)通过 “-a” 或者 “-A” 选项刷,来确认临时提交列表中的删除(否则有删除是不能提交的哦)。

# 新建一个文件并且提交到 Git库中的版本控制中
touch wait_delete.txt
git add . && git commit -m "又建了一个待删的文件"

# 删除这个文件
rm wait_delete.txt

# 尝试用平常的方法来提交 --> 不起作用的 ^_^~
git add . && git commit -m "让我提交吧"

输出:

# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add/rm <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#       删除:      wait_delete.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

# 通过使用 -a 选项来刷新提交列表
git commit -a -m "文件 wait_delete.txt 现在终于删掉了"

# 或者 你可以通过 add 命令 来确认临时列表中被删除的文件:
# git add -A . 
# git commit -m "文件 wait_delete.txt 这样也可以删滴" 

从临时列表中删除文件删除文件

你可以使用 git reset [filename] 命令来从临时列表中删除一个原本通过git add 命令添加的文件。

# 创建一个文件并添加到临时提交列表
touch unwantedstaged.txt
git add unwantedstaged.txt

# 不是日志君哦,当前临时列表的状态请使用 git status 来查看
git status

# 从临时列表中删除
git reset unwantedstaged.txt

# 状态君你也好 (笑
git status

# 那么,作为善后我们最好删掉这个文件
rm unwantedstaged.txt 

通过 git amend 修正提交

git –amend 命令可以让我们修改上一次提交的注释信息。

假设我们上一次提交的信息写错了字。那么这个命令可以通过 –amend 参数来修正。

# 假设你做了一些修改,现在要提交了
touch bug.txt
git add bug.txt

git commit -m "我的信息不小心写错了" 
git commit --amend -m "BUG.txt已添加 --- 注释已修正" 

我们最好应该在提交还未被别人所分享之前使用 git –amend 命令。因为 git –amend 命令创建一个新的 commit ID 而别人已却经有可能在我们之后做了更多的操作。这种情况下他们需要将所做的操作迁移到这个新的提交上。

WIN7 开启远程连接以及远程桌面连接

远程连接(通过IP访问共享文件夹)

由于Windows7 Telnet服务默认不开启,所以需要执行一下操作

开启服务

一:控制面板-程序-开启或关闭Windows功能-telnet服务器、telnet客户端勾上。

二:控制面板-管理工具-服务(或者开始-运行-services.msc)开启telnet服务(如果开启不了则右键-

属性-查看最后一个选项页-找到依赖项-开启前两个)

开启来宾用户

开始-双击右上角的图片-省略

访问

开始-运行-输入\192.168.X.X

远程桌面连接

一关闭防火墙

二为管理员设置密码,以便访问者访问

三我的电脑-右键属性-远程设置-远程-允许远程协助远程这台计算机、允许运用任意版本远程。。。 勾上

四控制面板-管理工具-服务-开启Remote Desktop Services(含截图)

C语言入门教程 索引

在线视频地址

新浪视频:http://video.sina.com.cn/search/index.php?k=C语言入门教程+lellansin
Acfun.tv:http://www.bilibili.tv/search?keyword=C语言入门教程
Bilibili.tv:http://www.acfun.tv/search.aspx#query=C语言入门教程

下载地址:

网盘地址: http://pan.baidu.com/share/link?shareid=100331&uk=941304789/

联系方式

QQ群:

  • C/C++ beginner 一群 10191598
  • C/C++ beginner 二群 163859361
  • C/C++ beginner 三群 10366953

C语言 运行外部程序

system()

库:stdlib.h
通过system()调用操作系统, 执行DOS命令(CMD命令), 如:

#include <stdio.h>

int main()
{
    system("dir C:");
    return 0;
}

这里就调用了dir命令, 将C:目录中的文件列举出来 (拓展 CMD基础知识)

使用system()来执行程序:

#相对路径
system("hello.exe");
#绝对路径
system("D:Testhello.exe");
#使用 start 命令调用程序
system("start C:Program Files (x86)TencentQQIntlBinQQ.exe");

cmd的start命令会启动一个独立的窗口来运行指定的程序或命令。
直接使用文件名执行与start执行的区别在于,直接执行是单线程的如果当前命令没执行完线程会一直阻塞,而start命令则是新开一个线程去执行命令,不用等你新开的程序执行完,当前cmd中的程序就会继续执行下去。

exec函数族

库:process.h
通过进程调用程序

// 相关函数列表
int execl  ( char *pathname, char *arg0, char *arg1, ... )
int execle ( char *pathname, char *arg0, char *arg1, ..., char *argn, NULL, char *envp[])
int execlp ( char *pathname, char *arg0, char *arg1, ..., NULL)
int execlpe( char *pathname, char *arg0, char *arg1, ..., NULL, char *envp[])
int execv  ( char *pathname, char *argv[])
int execve ( char *pathname, char *argv[], char *envp[])
int execvp ( char *pathname, char *argv[]) 
int execvpe( char *pathname, char *argv[], char *envp[])

简单介绍一下第一个execl()

函数定义:int execl(const char *path, const char *arg, …);

函数说明:execl()用来执行参数path字符串所代表的文件路径, 接下来的参数代表执行该文件时传递的argv[0],argv[1]…..最后一个参数必须用空指针NULL作结束。

返回值 :成功则不返回值, 失败返回-1, 失败原因存于errno中

#include <stdio.h>
#include <process.h>

int main()
{
	printf("调用D盘Test目录下的hello.exe, 第一个参数为改应用程序的名称");
	execl("D:\Test\hello.exe","hello");
	printf("进程已经被递交给了hello.exe,这里不会再执行");
}

windows api

其他还有windows api当中的调用函数

  • WinExec()
  • ShellExecute()
  • CreateProcess()

wordpress 常用插件

WP-UTF8-Excerpt

插件简介:

WordPress 自带的摘要功能只支持西方文字,其他 WordPress 摘要插件要么对中文支持得不好,容易出现乱码;要么把原文所有的格式都去掉,只剩光秃秃的文字。本插件是一个适合中文的摘要插件,可设置是否保留文章中的格式标签,如字体、颜色、链接、图片等。

主要特点:

1,支持多字节语言(如中文),不会产生乱码。
2,摘要可保留文章中的格式标签,如字体、颜色、链接、图片等(需保留的标签可在后台设置)。
3,首页每篇文章显示300字,存档页面每篇文章显示150字(字数可设置)。这里的字数是真正文字的有效字数,不包括各种 HTML 标签的字数。

SyntaxHighlighter Evolved

插件简介:

代码高亮插件 SyntaxHighlighter Evolved 支持更多的程序语言,现在支持的程序语言有20种,包括很少有插件支持的Bash/shell。支持高显亮配色主题,根据不同的blog主题,可以选择不同的配色主题,目前有6种配色主题可供选择。SyntaxHighlighter Evolved调用有多种方式,比如标准的Code标签等,有复制、打印菜单选项可供选择。

WP Cumulus

插件简介:

WP Cumulus是一款Wordpress插件, 使用它可以生成3D球状效果的可视化Flash标签云, 所有的标签在一个3D空间内不断回旋, 传达给用户强大的视觉冲击力。我想,这应该是我见过最漂亮的标签云效果。而这效果是Flash+JS实现的超炫Wordpress标签云效果。

Ultimate Follow Me Plugin

插件简介:

可以添加上Facebook、twitter等连接已便让用户找到

JiaThis分享工具

插件简介:

JiaThis是中国最大的社会化分享按钮及工具提供商,已经有超过28万家网站正在使用JiaThis高效稳定的服务。通过JiaThis分享工具,你网站的用户可以便捷的将您网站内容分享到各大社会化媒体网站,从而为网站带来更多的社会化流量。JiaThis支持多达110个国内外流行的社会化媒体网站,并且提供了强大的用户自定义接口。JiaThis不仅具有全面的数据分析功能,而且还会根据用户喜好,将用户最常用的社会化媒体排在最前面。

notepad++ 调用编译器

nppExec插件

早起版本的时候nppExec直接能在插件中找到,较新的版本中需要到:
插件(Plugins)->插件管理(Plugin Manager)->打开插件管理 (show Plugin Manager)->在可用(Available)中找到该插件点击下方的安装(Install)即可


安装后可用找到nppExec的选项

找到nppExec然后点击执行(Execute..)或者直接按F6,在弹出的窗口写下如下的代码

#编译前保存修改
NPP_SAVE
#切换到当前目录
cd "$(CURRENT_DIRECTORY)"
#清屏
cls
#调用编译器编译文件
"C:Program Files (x86)Lua5.1lua.exe" $(FILE_NAME) 

写好之后保存一下, 接着就可以在写完代码之后通过F6+回车直接编译, 并且在下方的控制台直接看到输出.

常见的java、python、ruby、Lua之类的都可以这样配置之后使用,如果需要配置环境变量也可以在F6的编译代码中加入环境变量设置

也可以配置 C语言编译器 CL.exe 之后整合nppExec插件。

centOS vpn 安装

一键安装包地址:http://blog.diahosting.com/linux-tutorial/pptpd/
系统要求:CentOS 5 32bits/64bits。
使用方法:
wget http://www.diahosting.com/dload/pptpd.sh
sh pptpd.sh
安装完成后会提示vpn用户名和密码。

VPN用户管理:
直接编辑/etc/ppp/chap-secrets文件,按照相同格式添加用户名和密码即可。
如有出入,参考下面教程修改配置文件

详细安装教程:

1、检查服务器是否有必要的支持.如果检查结果没有这些支持的话,是不能安装pptp的,执行指令:

#modprobe ppp-compress-18 && echo ok

这条执行执行后,显示”ok”则表明通过.不过接下来还需要做另一个检查,输入指令:

#cat /dev/net/tun

如果这条指令显示结果为下面的文本,则表明通过:
cat: /dev/net/tun: File descriptor in bad state
上述两条均通过,才能安装pptp.否则就只能考虑openvpn,或者请你的服务商来解决这个问题.

2、安装ppp和iptables(iptables可选).默认情况下,完整的CentOS是带有这两个组件的,但是精简版的系统可能没有.我们输入下面的命令来确认,如果没有则进行安装,有的话系统不会做任何动作:

#yum install -y ppp iptables

3、安装pptp.这个软件在yum源里是没有的,我们需要手动下载,我们先切换到tmp目录:

#cd /tmp

然后执行下面的命令来下载pptp安装包:

#wget http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.i386.rpm 

(32位系统使用)

#wget http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.x86_64.

rpm (64位系统使用)
如果你的CentOS是32位的,则执行32位的那条指令;如果是64位的CentOS,则执行64位的那条指令.
接下来安装pptp,同样分32位和64位系统:

#rpm -ivh pptpd-1.3.4-1.rhel5.1.i386.rpm (32位系统使用)
#rpm -ivh pptpd-1.3.4-1.rhel5.1.x86_64.rpm (64位系统使用)

4、配置pptp.首先我们要编辑/etc/pptpd.conf文件:

#vim /etc/pptpd.conf

找到”locapip”和”remoteip”这两个配置项,将前面的”;”注释符去掉,更改为你期望的IP段值.localip表示服务器的IP,remoteip表示分配给客户端的IP地址,可以设置为区间.这里我们使用pptp默认的配置:
localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245
注意,这里的IP段设置,将直接影响后面的iptables规则添加命令.请注意匹配的正确性,如果你嫌麻烦,建议就用本文的配置,就可以一直复制命令和文本使用了.
接下来我们再编辑/etc/ppp/options.pptpd文件,为VPN添加Google DNS:

#vim /etc/ppp/options.pptpd

在末尾添加下面两行:
ms-dns 8.8.8.8
ms-dns 8.8.4.4

5、设置pptp VPN账号密码.我们需要编辑/etc/ppp/chap-secrets这个文件:

#vim /etc/ppp/chap-secrets

在这个文件里面,按照”用户名 pptpd 密码 *”的形式编写,一行一个账号和密码.比如添加用户名为test,密码为1234的用户,则编辑如下内容:
test pptpd 1234 *

6、修改内核设置,使其支持转发.编辑/etc/sysctl.conf文件:

#vim /etc/sysctl.conf

将”net.ipv4.ip_forward”改为1,变成下面的形式.
net.ipv4.ip_forward=1
保存退出,并执行下面的命令来生效它:

#sysctl -p

7、(非必要)添加iptables转发规则.经过前面的6个步骤,我们的VPN已经可以拨号了,但是还不能访问任何网页.最后一步就是添加iptables转发规则了,输入下面的指令:

#iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

需要注意的是,这个指令中的”192.168.0.0/24″是根据之前的配置文件中的”localip”网段来改变的,比如你设置的”10.0.0.1″网段,则应该改为”10.0.0.0/24″.此外还有一点需要注意的是eth0,如果你的外网网卡不是eth0,而是eth1(比如SoftLayer的服务器就是这样的情况),那么请记得将eth0也更改为对应的网卡编号,不然是上不了网的.
然后我们输入下面的指令让iptables保存我们刚才的转发规则,以便重启系统后不需要再次添加:

#/etc/init.d/iptables save

然后我们重启iptables:

#/etc/init.d/iptables restart

8、重启pptp服务.输入下面的指令重启pptp:

#/etc/init.d/pptpd restart

现在你已经可以连接自己的VPN并浏览网页了.不过我们还需要做最后的一步.

9、设置开机自动运行服务.我们最后一步是将pptp和iptables设置为开机自动运行,这样就不需要每次重启服务器后手动启动服务了,当然你不需要自动启动服务的话可以忽略这一步,输入指令:

#chkconfig pptpd on
#chkconfig iptables on

这样就大功告成了,赶快到Windows下建立一个VPN连接,IP填写自己的服务器IP,用户名和密码填写自己设置好的用户名和密码,点击”连接”,成功后就可以使用服务器去浏览网页啦.
备注:
多ip服务器转发指定规则
iptables -t nat -A POSTROUTING -s 192.168.8.0/24 -j SNAT –to-source 192.168.8.1
or
iptables -t nat -A POSTROUTING -s 192.168.8.0/24 -j SNAT –to-source 服务器外网ip
如果iphone之类的设备能连上,访问网页或者youtube特别慢,需要做如下修改:
vi /etc/ppp/ip-up
增加一行
/sbin/ifconfig $1 mtu 1400

或者修改iptables规则
iptables -A FORWARD -p tcp –syn -s 192.168.8.0/24 -j TCPMSS –set-mss 1356
1356的值可能需要自己调整,调节到能保证网络正常使用情况下的最大值。

如果发现网络能连接,但是去无法打开网页,请检查DNS配置。或本地设置DNS解析服务器(如设置成8.8.8.8)

原文地址:
http://hi.baidu.com/ctkjatbj/item/9ba03377bd4f372ad7a89c5f