[磁盘问题]Linux下出现Read-only file system/Could not create lock at /xxx/xxx, Read-only file system
Unix/LinuxC技术 jackxiang 2017-6-27 22:33
fsck
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
/dev/sda3: recovering journal
Error reading block 105417495 (Attempt to read block from filesystem resulted in short read). Ignore error<y>? yes
Force rewrite<y>? yes
fsck.ext4: Bad magic number in super-block while trying to re-open /dev/sda3
e2fsck: io manager magic bad!
============================================
尽管上面没有啥文件,我选了Yes,于是出了问题:
fsck
-bash: /sbin/fsck: Input/output error
-------------------------------------------------
要选No:
尝试执行了一下fsck 直接出现了 修复提示,无任何异常!
如果出现这样的提示,就需要小心:
root@test ~]# fsck
fsck 1.35 (28-Feb-2004)
e2fsck 1.35 (28-Feb-2004)
/dev/sda1 is mounted.
WARNING!!! Running e2fsck on a mounted filesystem may cause
SEVERE filesystem damage.
Do you really want to continue (y/n)? no
check aborted.
[root@test ~]#
一定要选择NO,先拆卸文件系统,否则 对文件系统造成毁灭性的打击。
来自:http://blog.csdn.net/snowfoxmonitor/article/details/19121531
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
/dev/sda3: recovering journal
Error reading block 105417495 (Attempt to read block from filesystem resulted in short read). Ignore error<y>? yes
Force rewrite<y>? yes
fsck.ext4: Bad magic number in super-block while trying to re-open /dev/sda3
e2fsck: io manager magic bad!
============================================
尽管上面没有啥文件,我选了Yes,于是出了问题:
fsck
-bash: /sbin/fsck: Input/output error
-------------------------------------------------
要选No:
尝试执行了一下fsck 直接出现了 修复提示,无任何异常!
如果出现这样的提示,就需要小心:
root@test ~]# fsck
fsck 1.35 (28-Feb-2004)
e2fsck 1.35 (28-Feb-2004)
/dev/sda1 is mounted.
WARNING!!! Running e2fsck on a mounted filesystem may cause
SEVERE filesystem damage.
Do you really want to continue (y/n)? no
check aborted.
[root@test ~]#
一定要选择NO,先拆卸文件系统,否则 对文件系统造成毁灭性的打击。
来自:http://blog.csdn.net/snowfoxmonitor/article/details/19121531
zookeeper崩溃后修复之[myid:] - ERROR [main:Util@239] - Last transaction was partial.
Unix/LinuxC技术 jackxiang 2017-6-27 22:30
从网上搜索到方法进行解决:
cat /etc/zookeeper/conf/zoo.cfg
找到dataDir=/var/lib/zookeeper
切换到路径/var/lib/zookeeper
cd /var/lib/zookeeper
查看目录下的文件:
ls
存在version-2
删除version-2
mv ./version-2 ./version-2.bak
然后在zookeeper的实例中添加角色主机,启动成功。
看了老外的文章,下面是处理方法:
more /etc/zookeeper/conf.dist/zoo.cfg
找到datadir
[root@slave2 zookeeper]# pwd
/var/lib/zookeeper
[root@slave2 zookeeper]# ls
myid version-2 version-2.bak
清空version-2目录下的所有文件
来自:http://www.linuxdiyf.com/linux/16941.html
cat /etc/zookeeper/conf/zoo.cfg
找到dataDir=/var/lib/zookeeper
切换到路径/var/lib/zookeeper
cd /var/lib/zookeeper
查看目录下的文件:
ls
存在version-2
删除version-2
mv ./version-2 ./version-2.bak
然后在zookeeper的实例中添加角色主机,启动成功。
看了老外的文章,下面是处理方法:
more /etc/zookeeper/conf.dist/zoo.cfg
找到datadir
[root@slave2 zookeeper]# pwd
/var/lib/zookeeper
[root@slave2 zookeeper]# ls
myid version-2 version-2.bak
清空version-2目录下的所有文件
来自:http://www.linuxdiyf.com/linux/16941.html
安装没有遇到问题,TortoiseGit更新需要卸载时出现的问题,网上说把Exporer给停止掉再重启,发现不行。
再就是有人说那个文件夹C:\Windows\TEMP的权限不对引起,经过一阵折腾,发现的的确是那个问题引起的:
在目录上->右键->属性->安全->组或用户名->TrustedInstaller 权限全给勾上即可。
http://www.win7china.com/html/24965.html
http://www.win7china.com/html/24965.html
方法/步骤
把鼠标放到Win8屏幕的最左下角,等待Win8 Metro界面的缩略图出现后点击鼠标右键,在弹出的菜单中选择“命令提示符(管理员)”
打开的“命令提示符(管理员)”
找到自己将要安装的程序路径,比如:我要安装的这个程序在D盘的Others文件夹下
点击路径那一栏,把路径复制出来,然后再复制程序名称
在“命令提示符(管理员)”中输入 msiexec /package 你将要安装的程序的完整路径及程序名 (注意空格),比如:我是要安装D盘Others文件夹下的msxml
然后按回车键,安装程序就会自动启动,此时,你在安装的过程中就不会碰到2502、2503的错误了
再就是有人说那个文件夹C:\Windows\TEMP的权限不对引起,经过一阵折腾,发现的的确是那个问题引起的:
在目录上->右键->属性->安全->组或用户名->TrustedInstaller 权限全给勾上即可。
http://www.win7china.com/html/24965.html
http://www.win7china.com/html/24965.html
方法/步骤
把鼠标放到Win8屏幕的最左下角,等待Win8 Metro界面的缩略图出现后点击鼠标右键,在弹出的菜单中选择“命令提示符(管理员)”
打开的“命令提示符(管理员)”
找到自己将要安装的程序路径,比如:我要安装的这个程序在D盘的Others文件夹下
点击路径那一栏,把路径复制出来,然后再复制程序名称
在“命令提示符(管理员)”中输入 msiexec /package 你将要安装的程序的完整路径及程序名 (注意空格),比如:我是要安装D盘Others文件夹下的msxml
然后按回车键,安装程序就会自动启动,此时,你在安装的过程中就不会碰到2502、2503的错误了
Linux Pmap 命令 - 查看进程用了多少内存
Unix/LinuxC技术 jackxiang 2017-6-27 22:29
pmap -p pid
linux下如何查看最后登陆的几位用户的详细信息?
Unix/LinuxC技术 jackxiang 2017-6-27 22:23
背景:突然Mount的磁盘脱落挂载了,是不是有人上去做过安全给搞丢了?想看看都是谁?
last -20
lastlog |less
Linux下查看用户登陆历史记录,可以用root用户下的last命令查看:
1.查看单个用户的操作历史
[root@DB-Server ~]# cat /home/username/.bash_history
#username要查看的用户名
2.使用root登陆可查看用户登陆历史
[root@DB-Server ~]# su root
[root@DB-Server ~]# last -10
root pts/1 :0.0 Wed Dec 18 09:54 still logged in
root pts/4 :0.0 Wed Dec 18 09:43 - 09:48 (00:04)
root pts/1 :0.0 Wed Dec 18 09:43 - 09:48 (00:05)
root pts/3 192.168.103.79 Wed Dec 18 09:41 - 12:40 (02:59)
root pts/4 :0.0 Wed Dec 18 09:28 - 09:30 (00:01)
root pts/3 :0.0 Wed Dec 18 09:27 - 09:30 (00:02)
root pts/2 192.168.103.29 Wed Dec 18 09:27 still logged in
root pts/1 :0.0 Wed Dec 18 09:27 - 09:42 (00:15)
root pts/2 :0.0 Wed Dec 18 09:23 - 09:25 (00:01)
root pts/1 :0.0 Wed Dec 18 09:22 - 09:25 (00:02)
#查看最近10次用户历史操作记录
last 命令:
功能说明:列出目前与过去登入系统的用户相关信息。
语 法:last [-adRx][-f ][-n ][帐号名称…][终端机编号…]
参 数:
-a 把从何处登入系统的主机名称或IP地址,显示在最后一行;
-d 将IP地址转换成主机名称;
-f 指定记录文件;
-n 或- 设置列出名单的显示列数;
-R 不显示登入系统的主机名称或IP地址;
-x 显示系统关机,重新开机,以及执行等级的改变等信息;
lastlog可简单查看所有用户最后一次的登陆时间。
来自:https://zhidao.baidu.com/question/91897351.html
last -20
lastlog |less
Linux下查看用户登陆历史记录,可以用root用户下的last命令查看:
1.查看单个用户的操作历史
[root@DB-Server ~]# cat /home/username/.bash_history
#username要查看的用户名
2.使用root登陆可查看用户登陆历史
[root@DB-Server ~]# su root
[root@DB-Server ~]# last -10
root pts/1 :0.0 Wed Dec 18 09:54 still logged in
root pts/4 :0.0 Wed Dec 18 09:43 - 09:48 (00:04)
root pts/1 :0.0 Wed Dec 18 09:43 - 09:48 (00:05)
root pts/3 192.168.103.79 Wed Dec 18 09:41 - 12:40 (02:59)
root pts/4 :0.0 Wed Dec 18 09:28 - 09:30 (00:01)
root pts/3 :0.0 Wed Dec 18 09:27 - 09:30 (00:02)
root pts/2 192.168.103.29 Wed Dec 18 09:27 still logged in
root pts/1 :0.0 Wed Dec 18 09:27 - 09:42 (00:15)
root pts/2 :0.0 Wed Dec 18 09:23 - 09:25 (00:01)
root pts/1 :0.0 Wed Dec 18 09:22 - 09:25 (00:02)
#查看最近10次用户历史操作记录
last 命令:
功能说明:列出目前与过去登入系统的用户相关信息。
语 法:last [-adRx][-f ][-n ][帐号名称…][终端机编号…]
参 数:
-a 把从何处登入系统的主机名称或IP地址,显示在最后一行;
-d 将IP地址转换成主机名称;
-f 指定记录文件;
-n 或- 设置列出名单的显示列数;
-R 不显示登入系统的主机名称或IP地址;
-x 显示系统关机,重新开机,以及执行等级的改变等信息;
lastlog可简单查看所有用户最后一次的登陆时间。
来自:https://zhidao.baidu.com/question/91897351.html
lam是用php写的,所以使用时需要php支持很多模块,像对ldap的支持,对zip的支持。
php安装模块见http://fffo.blog.163.com/blog/static/211913068201401464238334/
1、官网下载
wget http://prdownloads.sourceforge.net/lam/ldap-account-manager-4.3.tar.bz2?download
2、解压
tar -xjf ldap-account-manager-4.3.tar.bz2
3、直接移动到apache 根目录
mv ldap-account-manager-4.3 /usr/local/apache/htdocs/lam
4、给它可以访问的权限
chmod 777 -R /usr/local/apache/htdocs/lam
5、进入配置目录
cd /usr/local/apache/htdocs/lam/config
6、创建主参数文件
cp config.cfg_sample config.cfg
7、创建连接ldap服务器参数文件
cp lam.conf_sample lam.conf
vim lam.conf
修改 所有的dc=1v,dc=cn
8、web访问
http://203.195.187.200/lam/templates/login.php
上面的模式是只限管理员登录模式。现在切换到用户登录模式
点击LAM配置——>编辑服务器配置文件——>默认密码是lam(可修改)——>通用设置——>安全设定
From:http://blog.csdn.net/u012461550/article/details/42608781
我的是在:
/usr/local/lam/etc/unix.conf
php安装模块见http://fffo.blog.163.com/blog/static/211913068201401464238334/
1、官网下载
wget http://prdownloads.sourceforge.net/lam/ldap-account-manager-4.3.tar.bz2?download
2、解压
tar -xjf ldap-account-manager-4.3.tar.bz2
3、直接移动到apache 根目录
mv ldap-account-manager-4.3 /usr/local/apache/htdocs/lam
4、给它可以访问的权限
chmod 777 -R /usr/local/apache/htdocs/lam
5、进入配置目录
cd /usr/local/apache/htdocs/lam/config
6、创建主参数文件
cp config.cfg_sample config.cfg
7、创建连接ldap服务器参数文件
cp lam.conf_sample lam.conf
vim lam.conf
修改 所有的dc=1v,dc=cn
8、web访问
http://203.195.187.200/lam/templates/login.php
上面的模式是只限管理员登录模式。现在切换到用户登录模式
点击LAM配置——>编辑服务器配置文件——>默认密码是lam(可修改)——>通用设置——>安全设定
From:http://blog.csdn.net/u012461550/article/details/42608781
我的是在:
/usr/local/lam/etc/unix.conf
error: insufficient permission for adding an object to repository database .git/objects
fatal: failed to write object
fatal: unpack-objects failed
$git pull
remote: Counting objects: 24, done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 24 (delta 14), reused 3 (delta 1)
error: insufficient permission for adding an object to repository database .git/objects
首先,得是Root:
#id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
然后:到那个出现 错的项目目录下面,它下面有一个.git这是肯定的,
1)对这个.git目录权限给斧正:
chmod 755 .git
chown -R xiangdong.irdcops .git
2)给它下面的文件和文件夹的权限斧正:
cd .git
find . -type f -exec chmod 644 {} \;
find . -type d -exec chmod 755 {} \;
参考:http://blog.sina.com.cn/s/blog_87b9bbc70102uyo3.html
fatal: failed to write object
fatal: unpack-objects failed
$git pull
remote: Counting objects: 24, done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 24 (delta 14), reused 3 (delta 1)
error: insufficient permission for adding an object to repository database .git/objects
首先,得是Root:
#id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
然后:到那个出现 错的项目目录下面,它下面有一个.git这是肯定的,
1)对这个.git目录权限给斧正:
chmod 755 .git
chown -R xiangdong.irdcops .git
2)给它下面的文件和文件夹的权限斧正:
cd .git
find . -type f -exec chmod 644 {} \;
find . -type d -exec chmod 755 {} \;
参考:http://blog.sina.com.cn/s/blog_87b9bbc70102uyo3.html
通过Strace定位故障原因之connect() failed (110: Connection timed out) while connecting to upstream
Unix/LinuxC技术 jackxiang 2017-6-27 22:18
rpm -ihv python-simplejson-2.0.9-8.el5.x86_64.rpm
warning: waiting for transaction lock on /var/lib/rpm/__db.000
rm -f /var/lib/rpm/__db.*
rpm --rebuilddb
yum clean all
再安装也就好了:
rpm -ihv python-simplejson-2.0.9-8.el5.x86_64.rpm
Preparing... ########################################### [100%]
1:python-simplejson ########################################### [100%]
================================================================
故障现象:
[root@localhost Mysql4.1.14.Rhel3]# rpm -ivh MySQL*
warning: waiting for transaction lock on /var/lib/rpm/__db.000
解决方法:
因为prm数据库出现损坏导致,可能导致多数rpm软件的升级、安装或者删除都会有问题。
此错误,请以root身份输入以下命令:
rm -f /var/lib/rpm/__db.*
rpm --rebuilddb
yum clean all
来自:http://blog.csdn.net/yunsongice/article/details/5587631
warning: waiting for transaction lock on /var/lib/rpm/__db.000
rm -f /var/lib/rpm/__db.*
rpm --rebuilddb
yum clean all
再安装也就好了:
rpm -ihv python-simplejson-2.0.9-8.el5.x86_64.rpm
Preparing... ########################################### [100%]
1:python-simplejson ########################################### [100%]
================================================================
故障现象:
[root@localhost Mysql4.1.14.Rhel3]# rpm -ivh MySQL*
warning: waiting for transaction lock on /var/lib/rpm/__db.000
解决方法:
因为prm数据库出现损坏导致,可能导致多数rpm软件的升级、安装或者删除都会有问题。
此错误,请以root身份输入以下命令:
rm -f /var/lib/rpm/__db.*
rpm --rebuilddb
yum clean all
来自:http://blog.csdn.net/yunsongice/article/details/5587631
git commit -am"" #提交除开没有Add的文件外的所有修改,如:git rm ,git mv,git add....
-----------
背景:一般是自己领先master几个版本,二是自己落后master几个版本,三是自己无论落后还是先进都和Master对齐(比如:分支,git checkout -b feature,修改index.html,再转到git checkout master,再合并分支到master,git merge feature...,最后,解决冲突并git add index.html,当然也可以commit -am....,提交并无误的情况下,删除git的特征分支:git branch -d feature ),如何解决上面三种冲突并能正常提交呢?
零、关于从暂存区回退方面的文章见:https://justwinit.cn/post/9253/
一、Git服务端版本领先问题参考:https://justwinit.cn/post/9300/
二、Git服务端版本落后问题本文解决:
#git push
To git@git.boosh.com.cn:irdcops/spec.boosh.com.cn.git
! [rejected] master -> master (fetch first)
error: 无法推送一些引用到 'git@git.boosh.com.cn:irdcops/spec.boosh.com.cn.git'
提示:更新被拒绝,因为远程仓库包含您本地尚不存在的提交。这通常是因为另外
提示:一个仓库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更
提示:(如 'git pull ...')。
提示:详见 'git push --help' 中的 'Note about fast-forwards' 小节。
[root@levoo-php-memcached-reids-zookeeper_bj_sjs_10_51_77_34:/tmp/gitstudy/conflict/spec.boosh.com.cn]
#git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
展开对象中: 100% (3/3), 完成.
来自 git.boosh.com.cn:irdcops/spec.boosh.com.cn
c333506..47f275b master -> origin/master
自动合并 README.md
冲突(内容):合并冲突于 README.md
自动合并失败,修正冲突然后提交修正的结果。
====================git status 提示双方修改:README.md====================
#git status
位于分支 master
您的分支和 'origin/master' 出现了偏离,
并且分别有 1 和 1 处不同的提交。
(使用 "git pull" 来合并远程分支)
您有尚未合并的路径。
(解决冲突并运行 "git commit")
未合并的路径:
(使用 "git add <文件>..." 标记解决方案)
双方修改: README.md
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
=====================查看文件=================================
#cat README.md
<<<<<<< HEAD
conflict 9:57 modify
=======
老王在这儿提交了一个并给提交到线上去了。-addTime:20170410 9:59
>>>>>>> 47f275befbc4fcd306eb4978fb75dde0545b040b
==================解决README.md文件===============
cat README.md
conflict 9:57 modify
老王在这儿提交了一个并给提交到线上去了。-addTime:20170410 9:59
================再查看该文件并pull一下查看状态================
git pull
error: Pull is not possible because you have unmerged files.
提示:请在工作区改正文件,然后酌情使用 'git add/rm <文件>' 命令标记
提示:解决方案并提交。
fatal: Exiting because of an unresolved conflict.
===理解修改尚未加入提交(使用 "git add" 和/或 "git commit -a")=====
git commit-m与-am的区别:https://segmentfault.com/q/1010000005900988
标识:也就是说得理解那几个区,这个-a 是指虽然跟踪了,但是没有git add纳入暂存区(自己已经纳入了,但是因为冲突了,别人修改了,它并没有在自己这边的暂存区里的意思。还得通过git add一次纳入自己本地的暂存区,或直接-a就能把本地合并冲突的文件直接纳入到暂存区,有点绕,应该就是这个意思,就可以git push解决这个冲突了。)
[注意]git commit -am可以写成git commit -a -m,但不能写成git commit -m -a,如果里面有一些草稿文件也就是并不需要提交的其它的文件本就在里面,会被一并提交上暂存区,这个一定要注意用-am时要把它们都删除掉,只留下需要入暂存区的文件,否则,会把所有的没有用的文件纳入后,再git push一下就会出现把很多没有用的文件提交上git服务器上去了。
==========实践上面的理解=============================================
git commit -am"解决冲突后,纳入自己的暂存区里 commit -am中的a就是这个意思,代替了git add 。"
[master 0006642] 解决冲突后,纳入自己的暂存区里 commit -am中的a就是这个意思,代替了git add 。
============解决冲突后放到暂存区后,再Git push也就成功能======================================
git push
对象计数中: 6, 完成.
压缩对象中: 100% (5/5), 完成.
写入对象中: 100% (6/6), 873 bytes | 0 bytes/s, 完成.
Total 6 (delta 0), reused 0 (delta 0)
To git@git.boosh.com.cn:irdcops/spec.boosh.com.cn.git
47f275b..0006642 master -> master
最后,果然提交成功,在那个老王的git目录下,再 git pull无问题,查看内容也就下来了:
git pull
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
展开对象中: 100% (6/6), 完成.
来自 git.boosh.com.cn:irdcops/spec.boosh.com.cn
47f275b..0006642 master -> origin/master
更新 47f275b..0006642
Fast-forward
README.md | 1 +
1 file changed, 1 insertion(+)
cat README.md
conflict 9:57 modify
老王在这儿提交了一个并给提交到线上去了。-addTime:20170410 9:59
三、git reset revert 回退回滚取消提交返回上一版本,最常用的是合并feature 分支的冲突解决:
一般没有别人开发出现冲突,是因自己回退引起的,
git reset revert 回退回滚取消提交返回上一版本:http://justwinit.cn/post/9253/
解决冲突合并分支:
http://m.toutiao.org/group/6407171134127472898/?iid=8936996522&app=news_article&tt_from=weixin&utm_source=weixin&utm_medium=toutiao_ios&utm_campaign=client_share&wxshare_count=1
实践成功如下步骤,注意,这种合并都是基于那个暂存库:
显示本地分支:
git branch
* master
新建分支
准备新的feature1分支,继续我们的新分支开发:
#git checkout -b feature #它是建立并进入到刚进入的分支。
切换到一个新分支 'feature'
再次建立的提示:
git checkout -b feature
fatal: 一个分支名 'feature' 已经存在。
查看分支的建立情况,有了:
git branch
* feature
master
修改文件 修改index.html:
#echo conflict >> index.html
vi index.html
hello jack ,write by feature...
在feature分支上提交:
git add index.html
git commit -m"提交到分支" ./index.html
===================================================================================================
切换回master分支:
git checkout master
A index.html
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。
master分支修改:
在master分支上修改index.html:
echo master_conflict >> index.html
vi index.html
add by jack from master...
提交到暂存库:
git commit -am"写两个字试一试吧~"
分支合并
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:
git merge feature
自动合并 index.html
冲突(内容):合并冲突于 index.html
自动合并失败,修正冲突然后提交修正的结果。
#cat index.html
create confilict with feature branch
master_conflict
<<<<<<< HEAD
add by jack from master...
=======
jackX
hello jack ,write by feature...
>>>>>>> feature
#git status #这儿注意了:用git commit -am"" 还是用git add index再git commit -m"" index.html的区别,前面有讲到。
位于分支 master
您的分支领先 'origin/master' 共 1 个提交。
(使用 "git push" 来发布您的本地提交)
您有尚未合并的路径。
(解决冲突并运行 "git commit")
未合并的路径:
(使用 "git add <文件>..." 标记解决方案)
双方修改: index.html
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
#git commit -am"直接am实现不用git add 就提交到master的暂存库里"
[master 386a151] 直接am实现不用git add 就提交到master的暂存库里
#git push
对象计数中: 12, 完成.
压缩对象中: 100% (11/11), 完成.
写入对象中: 100% (12/12), 1.20 KiB | 0 bytes/s, 完成.
Total 12 (delta 5), reused 0 (delta 0)
To git@git.boosh.com.cn:irdcops/spec.boosh.com.cn.git
e171ea5..386a151 master -> master
最后,删除feature分支:
# git branch -d feature
已删除分支 feature(曾为 4bcdf8e)。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
想从线上获取并覆盖本地:
git reset --hard
git pull
实践如下:
git reset --hard
HEAD 现在位于 a7e4eed rollo back
git log
commit a7e4eed0755b8b8c28de63ecc735565169466f8d
Author: 詹金斯 <17080156868@163.com>
Date: Mon Mar 27 20:55:07 2017 +0800
rollo back
再想回退是不行的:
git revert 0b82ab0dd0c898e0b7c18714a8b81b417f80a7bb zookeeper-3.4.9.el6.x86_64.spec
fatal: bad revision 'zookeeper-3.4.9.el6.x86_64.spec'
查看状态:
git status
位于分支 master
您的分支和 'origin/master' 出现了偏离,
并且分别有 2 和 2 处不同的提交。
(使用 "git pull" 来合并远程分支)
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
再从Git服务器上拉取:
git pull
自动合并 centos7/zookeeper-3.4.9.el6.x86_64.spec
冲突(内容):合并冲突于 centos7/zookeeper-3.4.9.el6.x86_64.spec
自动合并失败,修正冲突然后提交修正的结果。
=======================================================
如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候,
在发布这个配置文件的时候,会发生代码冲突:
error: Your local changes to the following files would be overwritten by merge:
protected/config/main.php
Please, commit your changes or stash them before you can merge.
如果希望保留生产服务器上所做的改动,仅仅并入新配置项, 处理方法如下:
git stash
git pull
git stash pop
然后可以使用Git diff -w +文件名 来确认代码自动合并的情况.
反过来,如果希望用代码库中的文件完全覆盖本地工作版本. 方法如下:
git reset --hard
git pull
其中git reset是针对版本,如果想针对文件回退本地修改,使用
在CODE上查看代码片派生到我的代码片
git checkout HEAD file/to/restore
参考自:http://blog.chinaunix.net/uid-10415985-id-4142896.html
http://blog.csdn.net/iefreer/article/details/7679631
-----------
背景:一般是自己领先master几个版本,二是自己落后master几个版本,三是自己无论落后还是先进都和Master对齐(比如:分支,git checkout -b feature,修改index.html,再转到git checkout master,再合并分支到master,git merge feature...,最后,解决冲突并git add index.html,当然也可以commit -am....,提交并无误的情况下,删除git的特征分支:git branch -d feature ),如何解决上面三种冲突并能正常提交呢?
零、关于从暂存区回退方面的文章见:https://justwinit.cn/post/9253/
一、Git服务端版本领先问题参考:https://justwinit.cn/post/9300/
二、Git服务端版本落后问题本文解决:
#git push
To git@git.boosh.com.cn:irdcops/spec.boosh.com.cn.git
! [rejected] master -> master (fetch first)
error: 无法推送一些引用到 'git@git.boosh.com.cn:irdcops/spec.boosh.com.cn.git'
提示:更新被拒绝,因为远程仓库包含您本地尚不存在的提交。这通常是因为另外
提示:一个仓库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更
提示:(如 'git pull ...')。
提示:详见 'git push --help' 中的 'Note about fast-forwards' 小节。
[root@levoo-php-memcached-reids-zookeeper_bj_sjs_10_51_77_34:/tmp/gitstudy/conflict/spec.boosh.com.cn]
#git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
展开对象中: 100% (3/3), 完成.
来自 git.boosh.com.cn:irdcops/spec.boosh.com.cn
c333506..47f275b master -> origin/master
自动合并 README.md
冲突(内容):合并冲突于 README.md
自动合并失败,修正冲突然后提交修正的结果。
====================git status 提示双方修改:README.md====================
#git status
位于分支 master
您的分支和 'origin/master' 出现了偏离,
并且分别有 1 和 1 处不同的提交。
(使用 "git pull" 来合并远程分支)
您有尚未合并的路径。
(解决冲突并运行 "git commit")
未合并的路径:
(使用 "git add <文件>..." 标记解决方案)
双方修改: README.md
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
=====================查看文件=================================
#cat README.md
<<<<<<< HEAD
conflict 9:57 modify
=======
老王在这儿提交了一个并给提交到线上去了。-addTime:20170410 9:59
>>>>>>> 47f275befbc4fcd306eb4978fb75dde0545b040b
==================解决README.md文件===============
cat README.md
conflict 9:57 modify
老王在这儿提交了一个并给提交到线上去了。-addTime:20170410 9:59
================再查看该文件并pull一下查看状态================
git pull
error: Pull is not possible because you have unmerged files.
提示:请在工作区改正文件,然后酌情使用 'git add/rm <文件>' 命令标记
提示:解决方案并提交。
fatal: Exiting because of an unresolved conflict.
===理解修改尚未加入提交(使用 "git add" 和/或 "git commit -a")=====
git commit-m与-am的区别:https://segmentfault.com/q/1010000005900988
标识:也就是说得理解那几个区,这个-a 是指虽然跟踪了,但是没有git add纳入暂存区(自己已经纳入了,但是因为冲突了,别人修改了,它并没有在自己这边的暂存区里的意思。还得通过git add一次纳入自己本地的暂存区,或直接-a就能把本地合并冲突的文件直接纳入到暂存区,有点绕,应该就是这个意思,就可以git push解决这个冲突了。)
[注意]git commit -am可以写成git commit -a -m,但不能写成git commit -m -a,如果里面有一些草稿文件也就是并不需要提交的其它的文件本就在里面,会被一并提交上暂存区,这个一定要注意用-am时要把它们都删除掉,只留下需要入暂存区的文件,否则,会把所有的没有用的文件纳入后,再git push一下就会出现把很多没有用的文件提交上git服务器上去了。
==========实践上面的理解=============================================
git commit -am"解决冲突后,纳入自己的暂存区里 commit -am中的a就是这个意思,代替了git add 。"
[master 0006642] 解决冲突后,纳入自己的暂存区里 commit -am中的a就是这个意思,代替了git add 。
============解决冲突后放到暂存区后,再Git push也就成功能======================================
git push
对象计数中: 6, 完成.
压缩对象中: 100% (5/5), 完成.
写入对象中: 100% (6/6), 873 bytes | 0 bytes/s, 完成.
Total 6 (delta 0), reused 0 (delta 0)
To git@git.boosh.com.cn:irdcops/spec.boosh.com.cn.git
47f275b..0006642 master -> master
最后,果然提交成功,在那个老王的git目录下,再 git pull无问题,查看内容也就下来了:
git pull
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
展开对象中: 100% (6/6), 完成.
来自 git.boosh.com.cn:irdcops/spec.boosh.com.cn
47f275b..0006642 master -> origin/master
更新 47f275b..0006642
Fast-forward
README.md | 1 +
1 file changed, 1 insertion(+)
cat README.md
conflict 9:57 modify
老王在这儿提交了一个并给提交到线上去了。-addTime:20170410 9:59
三、git reset revert 回退回滚取消提交返回上一版本,最常用的是合并feature 分支的冲突解决:
一般没有别人开发出现冲突,是因自己回退引起的,
git reset revert 回退回滚取消提交返回上一版本:http://justwinit.cn/post/9253/
解决冲突合并分支:
http://m.toutiao.org/group/6407171134127472898/?iid=8936996522&app=news_article&tt_from=weixin&utm_source=weixin&utm_medium=toutiao_ios&utm_campaign=client_share&wxshare_count=1
实践成功如下步骤,注意,这种合并都是基于那个暂存库:
显示本地分支:
git branch
* master
新建分支
准备新的feature1分支,继续我们的新分支开发:
#git checkout -b feature #它是建立并进入到刚进入的分支。
切换到一个新分支 'feature'
再次建立的提示:
git checkout -b feature
fatal: 一个分支名 'feature' 已经存在。
查看分支的建立情况,有了:
git branch
* feature
master
修改文件 修改index.html:
#echo conflict >> index.html
vi index.html
hello jack ,write by feature...
在feature分支上提交:
git add index.html
git commit -m"提交到分支" ./index.html
===================================================================================================
切换回master分支:
git checkout master
A index.html
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。
master分支修改:
在master分支上修改index.html:
echo master_conflict >> index.html
vi index.html
add by jack from master...
提交到暂存库:
git commit -am"写两个字试一试吧~"
分支合并
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:
git merge feature
自动合并 index.html
冲突(内容):合并冲突于 index.html
自动合并失败,修正冲突然后提交修正的结果。
#cat index.html
create confilict with feature branch
master_conflict
<<<<<<< HEAD
add by jack from master...
=======
jackX
hello jack ,write by feature...
>>>>>>> feature
#git status #这儿注意了:用git commit -am"" 还是用git add index再git commit -m"" index.html的区别,前面有讲到。
位于分支 master
您的分支领先 'origin/master' 共 1 个提交。
(使用 "git push" 来发布您的本地提交)
您有尚未合并的路径。
(解决冲突并运行 "git commit")
未合并的路径:
(使用 "git add <文件>..." 标记解决方案)
双方修改: index.html
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
#git commit -am"直接am实现不用git add 就提交到master的暂存库里"
[master 386a151] 直接am实现不用git add 就提交到master的暂存库里
#git push
对象计数中: 12, 完成.
压缩对象中: 100% (11/11), 完成.
写入对象中: 100% (12/12), 1.20 KiB | 0 bytes/s, 完成.
Total 12 (delta 5), reused 0 (delta 0)
To git@git.boosh.com.cn:irdcops/spec.boosh.com.cn.git
e171ea5..386a151 master -> master
最后,删除feature分支:
# git branch -d feature
已删除分支 feature(曾为 4bcdf8e)。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
想从线上获取并覆盖本地:
git reset --hard
git pull
实践如下:
git reset --hard
HEAD 现在位于 a7e4eed rollo back
git log
commit a7e4eed0755b8b8c28de63ecc735565169466f8d
Author: 詹金斯 <17080156868@163.com>
Date: Mon Mar 27 20:55:07 2017 +0800
rollo back
再想回退是不行的:
git revert 0b82ab0dd0c898e0b7c18714a8b81b417f80a7bb zookeeper-3.4.9.el6.x86_64.spec
fatal: bad revision 'zookeeper-3.4.9.el6.x86_64.spec'
查看状态:
git status
位于分支 master
您的分支和 'origin/master' 出现了偏离,
并且分别有 2 和 2 处不同的提交。
(使用 "git pull" 来合并远程分支)
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
再从Git服务器上拉取:
git pull
自动合并 centos7/zookeeper-3.4.9.el6.x86_64.spec
冲突(内容):合并冲突于 centos7/zookeeper-3.4.9.el6.x86_64.spec
自动合并失败,修正冲突然后提交修正的结果。
=======================================================
如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候,
在发布这个配置文件的时候,会发生代码冲突:
error: Your local changes to the following files would be overwritten by merge:
protected/config/main.php
Please, commit your changes or stash them before you can merge.
如果希望保留生产服务器上所做的改动,仅仅并入新配置项, 处理方法如下:
git stash
git pull
git stash pop
然后可以使用Git diff -w +文件名 来确认代码自动合并的情况.
反过来,如果希望用代码库中的文件完全覆盖本地工作版本. 方法如下:
git reset --hard
git pull
其中git reset是针对版本,如果想针对文件回退本地修改,使用
在CODE上查看代码片派生到我的代码片
git checkout HEAD file/to/restore
参考自:http://blog.chinaunix.net/uid-10415985-id-4142896.html
http://blog.csdn.net/iefreer/article/details/7679631
[实践OK]cat | wc -l 少一行的问题,linux的wc -l 命令统计文件少一行(一般是windows文件)。
Php/Js/Shell/Go jackxiang 2017-6-27 22:13
背景:用Windows下的Excel,再倒腾成Txt,在Linux下统计发现少一行,最后,用vi对最后一行的行尾按回车后再加一行,后删除这一行,再统计就对了,具体原因如下。
今天从一个服务器列表来批量执行expect脚本进行Tivoli Endpoint Client的安装,从excel表格中拷贝出服务器名导入到txt文件上传到服务器后,执行wc -l统计发现少了一行,反复对比确认不存在遗失的条目,那么为什么wc -l少一行呢?
查询帮助文件:
[root@managevm1 ~]# wc --help
-l, --lines print the newline counts
-l用来统计新行的个数,那么用什么来标记新行的开始呢?对了!用换行符\n。于是用 vi编辑器打开txt文件,在最后一行的行尾回车下,然后ESC推出到命令模式,dd删除自然生成的最后一个空行。保存退出再次运行wc -l统计,这样就和excel中的行数一样了。
=============================================================
先简单介绍
wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出
格式:wc file
命令参数:
-c 统计Bytes数(字节数),并显示文件名
-l 统计行数:使用换行符‘\n’作为行结束标志,实际是统计换行符个数
-m 统计字符数。这个标志不能与 -c标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
--version 显示版本信息
实例:
wc test.txt
6 24 132test.txt
默认输出:行,字数,字节数
test.txt内容
Cat test.txt
test1 name1 age1 sex1
test2 name2 age2 sex2
test3 name3 age3 sex3
test4 name4 age4 sex4
test5 name5 age5 sex5
test6 name6 age6 sex6
问题:wc 统计行数时少一行:
因为wc ?l是按\n作为行结束符统计行数,所以最后一行如果没有\n的话会统计丢失。
实例:比如,在windows下生成同上面test.txt相同的文件testtt.txt,上传到linux下:
cat testtt.txt
test1 name1 age1 sex1
test2 name2 age2 sex2
test3 name3 age3 sex3
test4 name4 age4 sex4
test5 name5 age5 sex5
test6 name6 age6 sex6[wizad@srv26 lmj]$
可以看出结尾有点奇怪。这是因为文件末尾无\n,而是直接用了文件结束符EOF。这样文件使用wc统计就会少一行:
wc -l testtt.txt
5 24 136 testtt.txt
使用管道也不行:
cat testtt.txt | wc -l
5
为什么linux下没有这样的问题?
因为vim编辑器会自动在文件结尾加上\n,在加上文件结束符EOF。(linux下文本文件主要按处理,所以vim会末行自动加\n)
而对windows文件用dos2unix转化也不行:
[wizad@srv26 lmj]$ dos2unix testtt.txt
dos2unix: converting file testtt.txt toUNIX format ...
[wizad@srv26 lmj]$ wc testtt.txt
5 24131 testtt.txt
可以看出windows文件在linux下还是有兼容问题的。文件字数没变24,byte数少5个是windows下行结束符是回车\r+换行\n。而linux下只是换行\n
Vim二进制可以看到不同,\n显示为.,文件结尾没有
来自:http://blog.csdn.net/sws9999/article/details/7942074
今天从一个服务器列表来批量执行expect脚本进行Tivoli Endpoint Client的安装,从excel表格中拷贝出服务器名导入到txt文件上传到服务器后,执行wc -l统计发现少了一行,反复对比确认不存在遗失的条目,那么为什么wc -l少一行呢?
查询帮助文件:
[root@managevm1 ~]# wc --help
-l, --lines print the newline counts
-l用来统计新行的个数,那么用什么来标记新行的开始呢?对了!用换行符\n。于是用 vi编辑器打开txt文件,在最后一行的行尾回车下,然后ESC推出到命令模式,dd删除自然生成的最后一个空行。保存退出再次运行wc -l统计,这样就和excel中的行数一样了。
=============================================================
先简单介绍
wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出
格式:wc file
命令参数:
-c 统计Bytes数(字节数),并显示文件名
-l 统计行数:使用换行符‘\n’作为行结束标志,实际是统计换行符个数
-m 统计字符数。这个标志不能与 -c标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
--version 显示版本信息
实例:
wc test.txt
6 24 132test.txt
默认输出:行,字数,字节数
test.txt内容
Cat test.txt
test1 name1 age1 sex1
test2 name2 age2 sex2
test3 name3 age3 sex3
test4 name4 age4 sex4
test5 name5 age5 sex5
test6 name6 age6 sex6
问题:wc 统计行数时少一行:
因为wc ?l是按\n作为行结束符统计行数,所以最后一行如果没有\n的话会统计丢失。
实例:比如,在windows下生成同上面test.txt相同的文件testtt.txt,上传到linux下:
cat testtt.txt
test1 name1 age1 sex1
test2 name2 age2 sex2
test3 name3 age3 sex3
test4 name4 age4 sex4
test5 name5 age5 sex5
test6 name6 age6 sex6[wizad@srv26 lmj]$
可以看出结尾有点奇怪。这是因为文件末尾无\n,而是直接用了文件结束符EOF。这样文件使用wc统计就会少一行:
wc -l testtt.txt
5 24 136 testtt.txt
使用管道也不行:
cat testtt.txt | wc -l
5
为什么linux下没有这样的问题?
因为vim编辑器会自动在文件结尾加上\n,在加上文件结束符EOF。(linux下文本文件主要按处理,所以vim会末行自动加\n)
而对windows文件用dos2unix转化也不行:
[wizad@srv26 lmj]$ dos2unix testtt.txt
dos2unix: converting file testtt.txt toUNIX format ...
[wizad@srv26 lmj]$ wc testtt.txt
5 24131 testtt.txt
可以看出windows文件在linux下还是有兼容问题的。文件字数没变24,byte数少5个是windows下行结束符是回车\r+换行\n。而linux下只是换行\n
Vim二进制可以看到不同,\n显示为.,文件结尾没有
来自:http://blog.csdn.net/sws9999/article/details/7942074
[实践OK]rpmbuild swoole的最新版本的spec打RPM包文件,在提交Git出现分离头指针记录,头指针分离自 15735cd。git branch -D 大写的D 删除分支,git branch -D dev。
Swoole专题研究 jackxiang 2017-6-27 19:12
内容:
背景:提交代码时出现了这个头指针分离自15735cd的问题,提示让:git branch <新分支名> 1c8c2b1,git branch dev 1c8c2b1,而默认创建分支是:git checkout -b dev,这个git branch dev 1c8c2b1,1c8c2b1前面还有c41273a,再前面就是分离的15735cd,于是,把分离后的两个版本,1c8c2b1 和c41273a 建立新的分支,再合并Merge回Master即可达到和提交一样的,找回这丢失的两次提交。
https://git.oschina.net/swoole/swoole/tree/v1.9.11
git clone https://git.oschina.net/swoole/swoole.git #git checkout 1.9 然后编译,因默认clone都是最新版。
#git checkout 1.9
分支 1.9 设置为跟踪来自 origin 的远程分支 1.9。
切换到一个新分支 '1.9'
#git branch -a
* 1.9
master
remotes/origin/1.9
remotes/origin/2.0
remotes/origin/2.0.1
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/swoole-1.7
remotes/origin/swoole-1.8
#git status
位于分支 1.9
您的分支与上游分支 'origin/1.9' 一致。
无文件要提交,干净的工作区
rm -rf .git #干掉没有用的.git,我只要这个版本的源代码并打包成tar.gz,然后作为rpmbuild -ba swoole-php71-1.9.11.el7.x86_64.spec
把 swoole-php71-1.9.11.el7.x86_64.spec 放进Git的Server端仓库出现问题了,如下:
#git status
头指针分离自 15735cd
无文件要提交,干净的工作区
[root@danke-php-memcached-reids-zookeeper_bj_sjs_10_51_77_34:/home/test/rpmbuild/SPECS/centos7/php71]
#git checkout master
警告:您正丢下 2 个提交,未和任何分支关联:
1c8c2b1 rpm包Swoole升级到最新版本,以及PHP-CP一块升级提交SPEC文件。
c41273a 删除掉的Swoole版本的Spec文件,添加新的Swoole版本的Spec文件。
如果您想要通过创建新分支保存它们,这可能是一个好时候。
如下操作:
git branch <新分支名> 1c8c2b1
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。
#git rev-list 15735cd ##指针在这儿丢失了:头指针分离自 15735cd。
15735cda1005046d7d671a2f1692f0e4d6edb977
bfaa314f6a7a212a386b3117c59a7e8be0c077a0
#git rev-list 1c8c2b1 #这个是最新的但是没有被记录到Git的Master分支服务器仓库里面。
1c8c2b1968cb303ee103fff62272a31a1b43fb57 #没有记录到,Log:1c8c2b1 rpm包Swoole升级到最新版本,以及PHP-CP一块升级提交SPEC文件。
c41273ad0cb545db8b6f1d4eb81b006552c915c9 #没有记录到,Log:c41273a 删除掉的Swoole版本的Spec文件,添加新的Swoole版本的Spec文件。
15735cda1005046d7d671a2f1692f0e4d6edb977 #指针在这儿丢失了:头指针分离自 15735cd。
bfaa314f6a7a212a386b3117c59a7e8be0c077a0
怎么办?
这时候可以执行git branch <新分支名> 1c8c2b1创建一个新的分支,这个分支是基于头指针分离下修改提交的952770d创建的。
然后,再合并回Master里面去即可。
操作步骤如下:
git branch dev 1c8c2b1
切换过Dev分支,看提交的Log在不?在就回到Master合并:
#git checkout dev
切换到分支 'dev'
果然在,如下:
#git log
commit 1c8c2b1968cb303ee103fff62272a31a1b43fb57
Author: 詹金斯 <13880156868@163.com>
Date: Thu Jun 1 22:56:43 2017 +0800
rpm包Swoole升级到最新版本,以及PHP-CP一块升级提交SPEC文件。
commit c41273ad0cb545db8b6f1d4eb81b006552c915c9
Author: 詹金斯 <13880156868@163.com>
Date: Thu Jun 1 20:31:59 2017 +0800
删除掉的Swoole版本的Spec文件,添加新的Swoole版本的Spec文件。
回到Master,直接合并到Master分支,如下:
Merge branch 'dev'
Master的头指针出现:头指针分离自 15735cd,新建立Dev分支,git branch dev 1c8c2b1,合并回Master来。 ----这一行是注释,后Vim保存即可。
# 请输入一个提交信息以解释此合并的必要性,尤其是将一个更新后的上游分支
# 合并到主题分支。
#
# 以 '#' 开头的行将被忽略,而且空提交说明将会终止提交。
保存后,跳到这儿了:
#git merge dev
自动合并 centos7/php71/swoole-php71-1.9.11.el7.x86_64.spec
Merge made by the 'recursive' strategy.
centos7/php71/php-cp-php71-1.5.0.el7.x86_64.spec | 2 +-
...swoole-php71-1.9.10.el7.x86_64.spec => swoole-php71-1.9.11.el7.x86_64.spec} | 10 +++++-----
centos7/tomcat-7.0.77.el6.x86_64.spec | 1 -
3 files changed, 6 insertions(+), 7 deletions(-)
rename centos7/php71/{swoole-php71-1.9.10.el7.x86_64.spec => swoole-php71-1.9.11.el7.x86_64.spec} (89%)
再确定合并及注释也Ok了,如下:
#git log
commit 432fbac58b19eb6a799d356b82d087a5340a1411
Merge: 78dab85 1c8c2b1
Author: 詹金斯 <13880156868@163.com>
Date: Thu Jun 1 23:24:33 2017 +0800
Merge branch 'dev'
Master的头指针出现:头指针分离自 15735cd,新建立Dev分支,git branch dev 1c8c2b1,合并回Master来。
成功!
git branch -D 大写的D 删除分支,git branch -D dev:
#git branch -D dev
已删除分支 dev(曾为 1c8c2b1)。
参考:http://blog.csdn.net/yuelengloulan/article/details/72823420
背景:提交代码时出现了这个头指针分离自15735cd的问题,提示让:git branch <新分支名> 1c8c2b1,git branch dev 1c8c2b1,而默认创建分支是:git checkout -b dev,这个git branch dev 1c8c2b1,1c8c2b1前面还有c41273a,再前面就是分离的15735cd,于是,把分离后的两个版本,1c8c2b1 和c41273a 建立新的分支,再合并Merge回Master即可达到和提交一样的,找回这丢失的两次提交。
https://git.oschina.net/swoole/swoole/tree/v1.9.11
git clone https://git.oschina.net/swoole/swoole.git #git checkout 1.9 然后编译,因默认clone都是最新版。
#git checkout 1.9
分支 1.9 设置为跟踪来自 origin 的远程分支 1.9。
切换到一个新分支 '1.9'
#git branch -a
* 1.9
master
remotes/origin/1.9
remotes/origin/2.0
remotes/origin/2.0.1
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/swoole-1.7
remotes/origin/swoole-1.8
#git status
位于分支 1.9
您的分支与上游分支 'origin/1.9' 一致。
无文件要提交,干净的工作区
rm -rf .git #干掉没有用的.git,我只要这个版本的源代码并打包成tar.gz,然后作为rpmbuild -ba swoole-php71-1.9.11.el7.x86_64.spec
把 swoole-php71-1.9.11.el7.x86_64.spec 放进Git的Server端仓库出现问题了,如下:
#git status
头指针分离自 15735cd
无文件要提交,干净的工作区
[root@danke-php-memcached-reids-zookeeper_bj_sjs_10_51_77_34:/home/test/rpmbuild/SPECS/centos7/php71]
#git checkout master
警告:您正丢下 2 个提交,未和任何分支关联:
1c8c2b1 rpm包Swoole升级到最新版本,以及PHP-CP一块升级提交SPEC文件。
c41273a 删除掉的Swoole版本的Spec文件,添加新的Swoole版本的Spec文件。
如果您想要通过创建新分支保存它们,这可能是一个好时候。
如下操作:
git branch <新分支名> 1c8c2b1
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。
#git rev-list 15735cd ##指针在这儿丢失了:头指针分离自 15735cd。
15735cda1005046d7d671a2f1692f0e4d6edb977
bfaa314f6a7a212a386b3117c59a7e8be0c077a0
#git rev-list 1c8c2b1 #这个是最新的但是没有被记录到Git的Master分支服务器仓库里面。
1c8c2b1968cb303ee103fff62272a31a1b43fb57 #没有记录到,Log:1c8c2b1 rpm包Swoole升级到最新版本,以及PHP-CP一块升级提交SPEC文件。
c41273ad0cb545db8b6f1d4eb81b006552c915c9 #没有记录到,Log:c41273a 删除掉的Swoole版本的Spec文件,添加新的Swoole版本的Spec文件。
15735cda1005046d7d671a2f1692f0e4d6edb977 #指针在这儿丢失了:头指针分离自 15735cd。
bfaa314f6a7a212a386b3117c59a7e8be0c077a0
怎么办?
这时候可以执行git branch <新分支名> 1c8c2b1创建一个新的分支,这个分支是基于头指针分离下修改提交的952770d创建的。
然后,再合并回Master里面去即可。
操作步骤如下:
git branch dev 1c8c2b1
切换过Dev分支,看提交的Log在不?在就回到Master合并:
#git checkout dev
切换到分支 'dev'
果然在,如下:
#git log
commit 1c8c2b1968cb303ee103fff62272a31a1b43fb57
Author: 詹金斯 <13880156868@163.com>
Date: Thu Jun 1 22:56:43 2017 +0800
rpm包Swoole升级到最新版本,以及PHP-CP一块升级提交SPEC文件。
commit c41273ad0cb545db8b6f1d4eb81b006552c915c9
Author: 詹金斯 <13880156868@163.com>
Date: Thu Jun 1 20:31:59 2017 +0800
删除掉的Swoole版本的Spec文件,添加新的Swoole版本的Spec文件。
回到Master,直接合并到Master分支,如下:
Merge branch 'dev'
Master的头指针出现:头指针分离自 15735cd,新建立Dev分支,git branch dev 1c8c2b1,合并回Master来。 ----这一行是注释,后Vim保存即可。
# 请输入一个提交信息以解释此合并的必要性,尤其是将一个更新后的上游分支
# 合并到主题分支。
#
# 以 '#' 开头的行将被忽略,而且空提交说明将会终止提交。
保存后,跳到这儿了:
#git merge dev
自动合并 centos7/php71/swoole-php71-1.9.11.el7.x86_64.spec
Merge made by the 'recursive' strategy.
centos7/php71/php-cp-php71-1.5.0.el7.x86_64.spec | 2 +-
...swoole-php71-1.9.10.el7.x86_64.spec => swoole-php71-1.9.11.el7.x86_64.spec} | 10 +++++-----
centos7/tomcat-7.0.77.el6.x86_64.spec | 1 -
3 files changed, 6 insertions(+), 7 deletions(-)
rename centos7/php71/{swoole-php71-1.9.10.el7.x86_64.spec => swoole-php71-1.9.11.el7.x86_64.spec} (89%)
再确定合并及注释也Ok了,如下:
#git log
commit 432fbac58b19eb6a799d356b82d087a5340a1411
Merge: 78dab85 1c8c2b1
Author: 詹金斯 <13880156868@163.com>
Date: Thu Jun 1 23:24:33 2017 +0800
Merge branch 'dev'
Master的头指针出现:头指针分离自 15735cd,新建立Dev分支,git branch dev 1c8c2b1,合并回Master来。
成功!
git branch -D 大写的D 删除分支,git branch -D dev:
#git branch -D dev
已删除分支 dev(曾为 1c8c2b1)。
参考:http://blog.csdn.net/yuelengloulan/article/details/72823420
[替换实战]sed模拟替换,sed -i (先sed -n匹配模拟替换输出加p模拟替换显示后)实现*.conf批量替换文件中的控制字符(特别是模拟替换),以替换PHP-FPM的PHP-SOCK位置为例子。
Php/Js/Shell/Go jackxiang 2017-6-27 11:08
核心是模拟替换,用
记住,斜杠要转意,再就是是 sed -n 's#abc#def#p' replcee.txt ==> sed -i 's#abc#def#' replcee.txt 不要有g,如: sed -i #abc#def#g replcee.txt,出现没有被替换:
sed -n "s#,'pdo-mysql-php70-7.0.5'#123#p" ./*.yml #单引不行用双引,sed -n 's#,\'pdo-mysql-php70-7.0.5\'#123#p' ./*.yml
真实的替换将123给去了:
&符号也要转义:
正确替换为:
PHP.ini替换示例:
sed -n "s#stream_socket_server,#333#p" php.ini
; disable_functions = chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,333fsocket
批量替换包含某些内容的sed结合grep脚本:
sed -i "s#localhost#10.71.182.128#g" grep -rl "localhost" ./
上面也可以实现先模拟替换,再真实替换,更靠谱一些:
sed -n 's#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/workspace\/#p' *.yml
真的替换:
sed -i 's#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/workspace\/#' *.yml
nginx.lua2内容,给$upstream_response_time变量加上引号:
'"upstream_response_time":$upstream_response_time,'
sed -n 's@:$upstream_response_time@:"$upstream_response_time"@p' /usr/local/share/lua/5.1/kong/templates/nginx.lua2
'"upstream_response_time":"$upstream_response_time",'
替换一下PHP的SOCK文件位置,/usr/local/php/var/run/php-fpm.sock ===> /dev/shm/php-fcgi.sock:
cat /usr/local/php/etc/php-fpm.conf |grep php-fpm.sock
cat /usr/local/nginx/conf/vhost/*.conf|grep php-fpm.sock
新的:
cat /usr/local/php/etc/php-fpm.conf |grep php-fcgi.sock
cat /usr/local/nginx/conf/vhost/*.conf|grep php-fcgi.sock
启动Nginx和PHP成功后删除软链接的sock文件:
ls -lart /usr/local/php/var/run/php-fpm.sock
rm -rf /usr/local/php/var/run/php-fpm.sock
ansible 10.70.32.33,10.70.32.32 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible 10.70.32.33,10.70.32.32 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/php/etc/php-fpm.conf"
cp -rf /usr/local/php/etc/php-fpm.conf /usr/local/php/etc/php-fpm.conf.bak.04.20
sed -i "s/\/usr\/local\/php\/var\/run\/php-fpm.sock/\/dev\/shm\/php-fcgi.sock/g" /usr/local/php/etc/php-fpm.conf
diff /usr/local/php/etc/php-fpm.conf.bak.04.20 /usr/local/php/etc/php-fpm.conf
service php-fpm restart
替换Nginx的配置文件:
批量测试:
ansible jack_vedio_upload -a"curl -i -H"Host:u.jackxiang.com" http://127.0.0.1/simpleupload.php"|grep 200 -B 2 > simpleupload.php.test.response.200.log
批量:
ansible 10.71.182.6 -a"sed -i 's/\/usr\/local\/php\/var\/run\/php-fpm.sock/\/dev\/shm\/php-fcgi.sock/g' /usr/local/php/etc/php-fpm.conf && service php-fpm restart"
换成#号:
ansible 192.168.112.161 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#g' /usr/local/php/etc/php-fpm.conf"
sed -n 's#\/usr\/local\/php\/var\/run\/php-fpm\.sock#\/dev\/shm\/php-fcgi\.sock#p' /usr/local/nginx/conf/vhost/*.conf
用ansible尝试批量替换#p ,注意显示内容:
ansible 10.71.182.6 -a"sed -n 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#p' /usr/local/nginx/conf/vhost/*.conf"
正式开始批量替换:
ansible 10.71.182.6 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible xiyou -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible xiyou_api -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible xiyou_my -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
<H2 class=post-title>用<FONT style="BACKGROUND-COLOR: #ffff00">awk</FONT>和sed实现批量替换文件中的控制字符</H2><DIV class=post-body> 有时候会遇到这样一个问题,就是把文件ftp上传到AIX系统以后,发现文件中包含了一些特殊的控制字符,例如最常见的^M。如果文件只是一个两个,那直接用vi打开文件,把文件中的控制字符替换掉就可以了。但如果文件数量很多的话,这样一个个去改就会变得很麻烦。这时候我们可以通过<FONT style="BACKGROUND-COLOR: #ffff00">awk</FONT>和sed实现对多个文件的批量处理,具体步骤如下:
1)假设需要修改的文件放在/tmp/test1目录下,然后新建一个目录,如/tmp/test2目录,这个目录用来存放修改后的文件。
ls -1 * | <FONT style="BACKGROUND-COLOR: #ffff00">awk</FONT> '{print "sed 's/^M//g' "$1" >/tmp/test2/"$1}' > sed.sh
生成的脚本文件如下所示:<BR><div class=code>sed s/^M//g test.txt >/tmp/test2/test.txt
sed s/^M//g test2.txt >/tmp/test2/test2.txt
3)执行生成的脚本文件:
就会在/tmp/test2目录下生成去掉控制字符^M后的文件。
一些其他的方法可以参考以下的文章:
<U><FONT color=#0000ff>用sed批量替换文件中的字符</FONT></U></A>
<U><FONT color=#0000ff>批量修改文件</FONT></U></A>
<U><FONT color=#0000ff>sed的in-place edit选项,和RTFM</FONT></U></A>
方法1:
这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.
手工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“替换为”http://localhost:8081/nexus/content/groups/public“.
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,
perl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'
方法2:
Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。
用sed命令可以批量替换多个文件中的字符串。
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`
例如:我要把mahuinan替换为huinanma,执行命令:
sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
这是目前linux最简单的批量替换字符串命令了!
具体格式如下:
sed -i "s/oldString/newString/g" `grep oldString -rl /path`
实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`
方法3:
在日程的开发过程中,可能大家会遇到将某个变量名修改为另一个变量名的情况,如果这个变量是一个局部变量的话,vi足以胜任,但是如果是某个全局变量的话,并且在很多文件中进行了使用,这个时候使用vi就是一个不明智的选择。这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:
grep "abc" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/abc/abcde/g'
记住,斜杠要转意,再就是是 sed -n 's#abc#def#p' replcee.txt ==> sed -i 's#abc#def#' replcee.txt 不要有g,如: sed -i #abc#def#g replcee.txt,出现没有被替换:
sed -n "s#,'pdo-mysql-php70-7.0.5'#123#p" ./*.yml #单引不行用双引,sed -n 's#,\'pdo-mysql-php70-7.0.5\'#123#p' ./*.yml
真实的替换将123给去了:
&符号也要转义:
正确替换为:
PHP.ini替换示例:
sed -n "s#stream_socket_server,#333#p" php.ini
; disable_functions = chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,333fsocket
批量替换包含某些内容的sed结合grep脚本:
sed -i "s#localhost#10.71.182.128#g" grep -rl "localhost" ./
上面也可以实现先模拟替换,再真实替换,更靠谱一些:
sed -n 's#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/workspace\/#p' *.yml
真的替换:
sed -i 's#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/workspace\/#' *.yml
nginx.lua2内容,给$upstream_response_time变量加上引号:
'"upstream_response_time":$upstream_response_time,'
sed -n 's@:$upstream_response_time@:"$upstream_response_time"@p' /usr/local/share/lua/5.1/kong/templates/nginx.lua2
'"upstream_response_time":"$upstream_response_time",'
替换一下PHP的SOCK文件位置,/usr/local/php/var/run/php-fpm.sock ===> /dev/shm/php-fcgi.sock:
cat /usr/local/php/etc/php-fpm.conf |grep php-fpm.sock
cat /usr/local/nginx/conf/vhost/*.conf|grep php-fpm.sock
新的:
cat /usr/local/php/etc/php-fpm.conf |grep php-fcgi.sock
cat /usr/local/nginx/conf/vhost/*.conf|grep php-fcgi.sock
启动Nginx和PHP成功后删除软链接的sock文件:
ls -lart /usr/local/php/var/run/php-fpm.sock
rm -rf /usr/local/php/var/run/php-fpm.sock
ansible 10.70.32.33,10.70.32.32 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible 10.70.32.33,10.70.32.32 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/php/etc/php-fpm.conf"
cp -rf /usr/local/php/etc/php-fpm.conf /usr/local/php/etc/php-fpm.conf.bak.04.20
sed -i "s/\/usr\/local\/php\/var\/run\/php-fpm.sock/\/dev\/shm\/php-fcgi.sock/g" /usr/local/php/etc/php-fpm.conf
diff /usr/local/php/etc/php-fpm.conf.bak.04.20 /usr/local/php/etc/php-fpm.conf
service php-fpm restart
替换Nginx的配置文件:
批量测试:
ansible jack_vedio_upload -a"curl -i -H"Host:u.jackxiang.com" http://127.0.0.1/simpleupload.php"|grep 200 -B 2 > simpleupload.php.test.response.200.log
批量:
ansible 10.71.182.6 -a"sed -i 's/\/usr\/local\/php\/var\/run\/php-fpm.sock/\/dev\/shm\/php-fcgi.sock/g' /usr/local/php/etc/php-fpm.conf && service php-fpm restart"
换成#号:
ansible 192.168.112.161 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#g' /usr/local/php/etc/php-fpm.conf"
sed -n 's#\/usr\/local\/php\/var\/run\/php-fpm\.sock#\/dev\/shm\/php-fcgi\.sock#p' /usr/local/nginx/conf/vhost/*.conf
用ansible尝试批量替换#p ,注意显示内容:
ansible 10.71.182.6 -a"sed -n 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#p' /usr/local/nginx/conf/vhost/*.conf"
正式开始批量替换:
ansible 10.71.182.6 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible xiyou -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible xiyou_api -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible xiyou_my -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
<H2 class=post-title>用<FONT style="BACKGROUND-COLOR: #ffff00">awk</FONT>和sed实现批量替换文件中的控制字符</H2><DIV class=post-body> 有时候会遇到这样一个问题,就是把文件ftp上传到AIX系统以后,发现文件中包含了一些特殊的控制字符,例如最常见的^M。如果文件只是一个两个,那直接用vi打开文件,把文件中的控制字符替换掉就可以了。但如果文件数量很多的话,这样一个个去改就会变得很麻烦。这时候我们可以通过<FONT style="BACKGROUND-COLOR: #ffff00">awk</FONT>和sed实现对多个文件的批量处理,具体步骤如下:
1)假设需要修改的文件放在/tmp/test1目录下,然后新建一个目录,如/tmp/test2目录,这个目录用来存放修改后的文件。
ls -1 * | <FONT style="BACKGROUND-COLOR: #ffff00">awk</FONT> '{print "sed 's/^M//g' "$1" >/tmp/test2/"$1}' > sed.sh
生成的脚本文件如下所示:<BR><div class=code>sed s/^M//g test.txt >/tmp/test2/test.txt
sed s/^M//g test2.txt >/tmp/test2/test2.txt
3)执行生成的脚本文件:
就会在/tmp/test2目录下生成去掉控制字符^M后的文件。
一些其他的方法可以参考以下的文章:
<U><FONT color=#0000ff>用sed批量替换文件中的字符</FONT></U></A>
<U><FONT color=#0000ff>批量修改文件</FONT></U></A>
<U><FONT color=#0000ff>sed的in-place edit选项,和RTFM</FONT></U></A>
方法1:
这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.
手工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“替换为”http://localhost:8081/nexus/content/groups/public“.
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,
perl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'
方法2:
Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。
用sed命令可以批量替换多个文件中的字符串。
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`
例如:我要把mahuinan替换为huinanma,执行命令:
sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
这是目前linux最简单的批量替换字符串命令了!
具体格式如下:
sed -i "s/oldString/newString/g" `grep oldString -rl /path`
实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`
方法3:
在日程的开发过程中,可能大家会遇到将某个变量名修改为另一个变量名的情况,如果这个变量是一个局部变量的话,vi足以胜任,但是如果是某个全局变量的话,并且在很多文件中进行了使用,这个时候使用vi就是一个不明智的选择。这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:
grep "abc" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/abc/abcde/g'
创建规则容易,如何取消规则?
------------------------------------------
开始-----规则---下拉菜单中选择管理规则和通知。
勾选需要取消的规格,将其删除,确定。
来自:http://wenda.so.com/q/1459278170727172?src=140
创建规则:http://wenda.so.com/q/1369953110068210
------------------------------------------
开始-----规则---下拉菜单中选择管理规则和通知。
勾选需要取消的规格,将其删除,确定。
来自:http://wenda.so.com/q/1459278170727172?src=140
创建规则:http://wenda.so.com/q/1369953110068210
MySQL 5.6 警告信息 command line interface can be insecure 修复
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
在命令行输入密码,就会提示这些安全警告信息。
Warning: Using a password on the command line interface can be insecure.
注: mysql -u root -pPASSWORD 或 mysqldump -u root -pPASSWORD 都会输出这样的警告信息.
1、针对mysql
mysql -u root -pPASSWORD 改成mysql -u root -p 在输入密码即可.
2、mysqldump就比较麻烦了,通常都写在scripts脚本中。
解决方法:
对于 mysqldump 要如何避免出现(Warning: Using a password on the command line interface can be insecure.) 警告信息呢?
vim /etc/mysql/my.cnf
[mysqldump]
user=your_backup_user_name
password=your_backup_password
修改完配置文件后, 只需要执行mysqldump 脚本就可以了。备份脚本中不需要涉及用户名密码相关信息。
来自:http://880314.blog.51cto.com/4008847/1348413
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
在命令行输入密码,就会提示这些安全警告信息。
Warning: Using a password on the command line interface can be insecure.
注: mysql -u root -pPASSWORD 或 mysqldump -u root -pPASSWORD 都会输出这样的警告信息.
1、针对mysql
mysql -u root -pPASSWORD 改成mysql -u root -p 在输入密码即可.
2、mysqldump就比较麻烦了,通常都写在scripts脚本中。
解决方法:
对于 mysqldump 要如何避免出现(Warning: Using a password on the command line interface can be insecure.) 警告信息呢?
vim /etc/mysql/my.cnf
[mysqldump]
user=your_backup_user_name
password=your_backup_password
修改完配置文件后, 只需要执行mysqldump 脚本就可以了。备份脚本中不需要涉及用户名密码相关信息。
来自:http://880314.blog.51cto.com/4008847/1348413
[实践OK]Linux下使用find命令使用-exec 进行两次大括号传入路径进行cat重定向到对应的特定文件,清空日志目录日志。
Php/Js/Shell/Go jackxiang 2017-6-24 13:06
[实践OK]Linux下使用find命令使用-exec 进行两次大括号传入路径进行cat重定向到对应的特定文件可结合xargs 相关命令:http://jackxiang.com/post/6520/
find超级查找,路径模糊、文件名模糊、时间、大小:
看文件名:https://linux.cn/article-6956-1.html ,使用 -l 选项可以只显示文件名。 ll |grep ^d 只显示目录。
查找所有Conf文件包含了upstream的时间变量的文件列出来:
./nginx.conf
#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
59 23 * * 0 find /home/git/gitlab/log -name "*.log" -exec bash -c "echo '' > {}" \;
=============================================
这个解决方法我可是找了好久。。。正确写法:
find -name "*" -exec sh -c 'cat {} > {}.out.iso' \;
find -name "*.php" -exec bash -c "mv -f {} {}.tmp" \;
find -name "*.php" -exec bash -c "copy {} {}.tmp" \;
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}.tmp; mv -f {}.tmp {}" \;
替换文件名内容:
find /tmp/exectest -name "*.txt" -exec bash -c "ls {}" \;
/tmp/exectest/b.txt
/tmp/exectest/aaa/ccc.txt
find /tmp/exectest -name "*.txt" -exec bash -c "ls {}|sed -e 's/txt/php/'" \;
/tmp/exectest/b.php
/tmp/exectest/aaa/ddd.php
批量给不同层次的目录包含的*.log里写入jackwriteLog或清空日志:
find -name "*.log" -exec bash -c "echo '' > {}" \;
#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
59 23 * * 0 find /home/git/gitlab/log -name "*.log" -exec bash -c "echo "" > {}" \;
修改为这样:
#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
find /home/git/gitlab/log -name "*.log" -exec bash -c "echo "" > {}" \;
# find -name "*.log" -exec bash -c "echo 'jackwriteLog' > {}" \;
# cat ./k.log
jackwriteLog
# cat ./n/n.log
jackwriteLog
# cat ./n/j/a.log
jackwriteLog
find -name "*.php" -exec bash -c "cp {} {}.tmp" \;
a.php a.php.tmp b.php b.php.tmp
@ 2010-08-20 BS一下不看manpage的自己
引用
$ man sed
...
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
...
也就是说,只需要用 sed -i 就可以直接替换文件中的内容
======以前的分割线======
要用sed批量修改文件的内容,但是用这个命令解决不了问题:
find -name "*.php" -exec sed -e 's/aaa/bbb/' {} > {} \;
因为bash把 > 解释为find命令输出的重定向。
修改一下:
find -name "*.php" -exec sed -e 's/aaa/bbb/' {} \> {} \;
还是不行,因为 sed 去寻找一个名为 > 的文件进行处理
再修改:
find -name "*.php" -exec "sed -e 's/aaa/bbb/' {} \> {} " \;
还是不行,因为find去找一个名为 "sed -e 's/aaa/bbb/' {} \> {} " 的程序来执行
那是囧之又囧阿。于是去baidu,去google,
但是无论baidu还是google "find -exec 重定向"
都搜不到相应的解决方案,这样的问题居然没有人遇到过?
于是用google搜了一下
引用
linux find using "-exec" sed redirect
搜到了这一页: http://www.loisch.de/linux.html
看来还是国人太ooxx了,sigh。
解决方案其实很简单:绕个弯,把 -exec 的命令给shell来执行
注意:下面的命令一定不要在有用的文件上直接尝试!!!!!!
引用
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}" \;
哦也!没有错误提示了!
然后 ls -al 一下,爽!所有文件大小都变成 0 了!
为什么捏?那篇文章里面解释了:
因为bash检测到需要重定向到那个文件,所以事先把那个文件清空了。
那篇文章里面提到一个修改bash配置的解决方案,但是不通用,建议还是用他说的第二种方案:
引用
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}.tmp; mv -f {}.tmp {}" \;
嘿,这下爽了!
From:https://www.felix021.com/blog/read.php?1465
像下面这些文章只是说这么用,但从不说为何,在QQ群里说只一句重定向,没一个解释更深入点的,附录:
如何在-exec参数中使用重定向
http://www.2cto.com/os/201306/222794.html
Clear log file content without impacting service that is running (in batch):
find . -name "*.log" -exec bash -c ">{}" \;
Subsitute file content in batch:
find -name "*.xml" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}" \;
http://blog.csdn.net/duanlove/article/details/8261677
find超级查找,路径模糊、文件名模糊、时间、大小:
看文件名:https://linux.cn/article-6956-1.html ,使用 -l 选项可以只显示文件名。 ll |grep ^d 只显示目录。
查找所有Conf文件包含了upstream的时间变量的文件列出来:
./nginx.conf
#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
59 23 * * 0 find /home/git/gitlab/log -name "*.log" -exec bash -c "echo '' > {}" \;
=============================================
这个解决方法我可是找了好久。。。正确写法:
find -name "*" -exec sh -c 'cat {} > {}.out.iso' \;
find -name "*.php" -exec bash -c "mv -f {} {}.tmp" \;
find -name "*.php" -exec bash -c "copy {} {}.tmp" \;
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}.tmp; mv -f {}.tmp {}" \;
替换文件名内容:
find /tmp/exectest -name "*.txt" -exec bash -c "ls {}" \;
/tmp/exectest/b.txt
/tmp/exectest/aaa/ccc.txt
find /tmp/exectest -name "*.txt" -exec bash -c "ls {}|sed -e 's/txt/php/'" \;
/tmp/exectest/b.php
/tmp/exectest/aaa/ddd.php
批量给不同层次的目录包含的*.log里写入jackwriteLog或清空日志:
find -name "*.log" -exec bash -c "echo '' > {}" \;
#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
59 23 * * 0 find /home/git/gitlab/log -name "*.log" -exec bash -c "echo "" > {}" \;
修改为这样:
#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
find /home/git/gitlab/log -name "*.log" -exec bash -c "echo "" > {}" \;
# find -name "*.log" -exec bash -c "echo 'jackwriteLog' > {}" \;
# cat ./k.log
jackwriteLog
# cat ./n/n.log
jackwriteLog
# cat ./n/j/a.log
jackwriteLog
find -name "*.php" -exec bash -c "cp {} {}.tmp" \;
a.php a.php.tmp b.php b.php.tmp
@ 2010-08-20 BS一下不看manpage的自己
引用
$ man sed
...
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
...
也就是说,只需要用 sed -i 就可以直接替换文件中的内容
======以前的分割线======
要用sed批量修改文件的内容,但是用这个命令解决不了问题:
find -name "*.php" -exec sed -e 's/aaa/bbb/' {} > {} \;
因为bash把 > 解释为find命令输出的重定向。
修改一下:
find -name "*.php" -exec sed -e 's/aaa/bbb/' {} \> {} \;
还是不行,因为 sed 去寻找一个名为 > 的文件进行处理
再修改:
find -name "*.php" -exec "sed -e 's/aaa/bbb/' {} \> {} " \;
还是不行,因为find去找一个名为 "sed -e 's/aaa/bbb/' {} \> {} " 的程序来执行
那是囧之又囧阿。于是去baidu,去google,
但是无论baidu还是google "find -exec 重定向"
都搜不到相应的解决方案,这样的问题居然没有人遇到过?
于是用google搜了一下
引用
linux find using "-exec" sed redirect
搜到了这一页: http://www.loisch.de/linux.html
看来还是国人太ooxx了,sigh。
解决方案其实很简单:绕个弯,把 -exec 的命令给shell来执行
注意:下面的命令一定不要在有用的文件上直接尝试!!!!!!
引用
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}" \;
哦也!没有错误提示了!
然后 ls -al 一下,爽!所有文件大小都变成 0 了!
为什么捏?那篇文章里面解释了:
因为bash检测到需要重定向到那个文件,所以事先把那个文件清空了。
那篇文章里面提到一个修改bash配置的解决方案,但是不通用,建议还是用他说的第二种方案:
引用
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}.tmp; mv -f {}.tmp {}" \;
嘿,这下爽了!
From:https://www.felix021.com/blog/read.php?1465
像下面这些文章只是说这么用,但从不说为何,在QQ群里说只一句重定向,没一个解释更深入点的,附录:
如何在-exec参数中使用重定向
http://www.2cto.com/os/201306/222794.html
Clear log file content without impacting service that is running (in batch):
find . -name "*.log" -exec bash -c ">{}" \;
Subsitute file content in batch:
find -name "*.xml" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}" \;
http://blog.csdn.net/duanlove/article/details/8261677
超实用shell技巧 —— !$,以及!:$+1(free !:1)和上个命令各个参数的表示方法,Esc + . 和!$一样一样的。
Php/Js/Shell/Go jackxiang 2017-6-24 13:05
在shell中,!$是一个特殊的环境变量,它代表了上一个命令的最后一个参数。
自己常常使用:Esc + . 和!$一样一样的。
$! 刚好写法相反,则表示Shell最后运行的后台Process的PID,看下面的例子:
mkdir -p /tmp/a/b/c/d/e/f
# ls !$
ls /tmp/a/b/c/d/e/f
# ls !$
ls /tmp/a/b/c/d/e/f
a.txt b.txt c.txt
# rm -Rf !$
rm -Rf /tmp/a/b/c/d/e/f
# ls !$
ls /tmp/a/b/c/d/e/f
ls: 无法访问/tmp/a/b/c/d/e/f: 没有那个文件或目录
Shell参数变量之 !:0是命令行,!:1是参数1,!:2是参数2,如下所示:
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo hello world
hello world
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo !:3
-bash: :3: bad word specifier
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo hello world
hello world
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo !:2
echo world
world
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo !:1
echo world
world
例二:
# free -m
total used free shared buff/cache available
Mem: 991 856 32 34 103 29
Swap: 1407 321 1086
# free !:1
free -m total used free shared buff/cache available
Mem: 991 856 36 34 98 31
Swap: 1407 321 1086
===============================================
$ echo hello world
hello world
$ echo !$
echo worldworld
$ echo "hello world"
hello world
$ echo !$
echo "hello world"
hello world
这里为什么要用echo呢,请看下面,如果不用echo,!$输出的内容(world)会被shell当做一个命令来执行,所以就会报错
$ echo hello world
hello world
$ !$
world
No command 'world' found, did you mean:
Command 'tworld' from package 'tworld' (universe)
world: command not found
应用场景示例
1、建立多层目录并进入建立好的多层目录
$ mkdir -p a/b/c/d/e
$ cd a/b/c/d/e
改成
$ mkdir -p a/b/c/d/e
$ cd !$
上面mkdir -p命令用来一次性建立多层目录
2、编写文件后检测文件格式或者编译文件
$ vi a.php
$ php -l !$
或者
$ vi main.c
$ gcc !$
你可能不知道的超实用shell技巧 —— !$。
中,我们知道了 在shell中,!$代表了上一个命令的最后一个参数。那如果要获取上个命令的其它参数该怎么操作呢?
还是以echo hello world命令为例,下面就演示在该命令执行完成后,如何获取命令的各个参数甚至命令本身。
# echo helloworld
hello world
# echo !:1
echo hello
hello
# echo helloworld
hello world
# echo !:2
echo world
world
# echo hello world
hello world
# echo !:3
-bash: :3: bad word specifier
在调用!:3的时候出错了,因为上一次的命令只有两个参数。
下面你应该知道如何获取上次执行的是哪个命令了,那就是!:0,请看下面
# echo hello world
hello world
# echo !:0
echo echo
echo
其实呢,有更好的表示方法,看下面
# echo hello world
hello world
# echo !#
echo echo
echo
总结
!# 上一个命令名
!$ 上一个命令的最后一个参数
!:n 上一个命令的第n个参数
参考文章
http://crazyof.me/blog/archives/171.html
自己常常使用:Esc + . 和!$一样一样的。
$! 刚好写法相反,则表示Shell最后运行的后台Process的PID,看下面的例子:
mkdir -p /tmp/a/b/c/d/e/f
# ls !$
ls /tmp/a/b/c/d/e/f
# ls !$
ls /tmp/a/b/c/d/e/f
a.txt b.txt c.txt
# rm -Rf !$
rm -Rf /tmp/a/b/c/d/e/f
# ls !$
ls /tmp/a/b/c/d/e/f
ls: 无法访问/tmp/a/b/c/d/e/f: 没有那个文件或目录
Shell参数变量之 !:0是命令行,!:1是参数1,!:2是参数2,如下所示:
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo hello world
hello world
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo !:3
-bash: :3: bad word specifier
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo hello world
hello world
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo !:2
echo world
world
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo !:1
echo world
world
例二:
# free -m
total used free shared buff/cache available
Mem: 991 856 32 34 103 29
Swap: 1407 321 1086
# free !:1
free -m total used free shared buff/cache available
Mem: 991 856 36 34 98 31
Swap: 1407 321 1086
===============================================
$ echo hello world
hello world
$ echo !$
echo worldworld
$ echo "hello world"
hello world
$ echo !$
echo "hello world"
hello world
这里为什么要用echo呢,请看下面,如果不用echo,!$输出的内容(world)会被shell当做一个命令来执行,所以就会报错
$ echo hello world
hello world
$ !$
world
No command 'world' found, did you mean:
Command 'tworld' from package 'tworld' (universe)
world: command not found
应用场景示例
1、建立多层目录并进入建立好的多层目录
$ mkdir -p a/b/c/d/e
$ cd a/b/c/d/e
改成
$ mkdir -p a/b/c/d/e
$ cd !$
上面mkdir -p命令用来一次性建立多层目录
2、编写文件后检测文件格式或者编译文件
$ vi a.php
$ php -l !$
或者
$ vi main.c
$ gcc !$
你可能不知道的超实用shell技巧 —— !$。
中,我们知道了 在shell中,!$代表了上一个命令的最后一个参数。那如果要获取上个命令的其它参数该怎么操作呢?
还是以echo hello world命令为例,下面就演示在该命令执行完成后,如何获取命令的各个参数甚至命令本身。
# echo helloworld
hello world
# echo !:1
echo hello
hello
# echo helloworld
hello world
# echo !:2
echo world
world
# echo hello world
hello world
# echo !:3
-bash: :3: bad word specifier
在调用!:3的时候出错了,因为上一次的命令只有两个参数。
下面你应该知道如何获取上次执行的是哪个命令了,那就是!:0,请看下面
# echo hello world
hello world
# echo !:0
echo echo
echo
其实呢,有更好的表示方法,看下面
# echo hello world
hello world
# echo !#
echo echo
echo
总结
!# 上一个命令名
!$ 上一个命令的最后一个参数
!:n 上一个命令的第n个参数
参考文章
http://crazyof.me/blog/archives/171.html
结论:僵尸进程 杀杀杀 杀不死 重启机器
The system is going down for halt NOW!
====================================================
uptime
16:22:19 up 735 days, 5:48, 7 users, load average: 59.70, 58.29, 54.91
close_wait状态出现的原因是被动关闭方未关闭socket造成
tcp 179 0 127.0.0.1:80 127.0.0.1:4184 CLOSE_WAIT -
tcp 175 0 127.0.0.1:80 127.0.0.1:6038 CLOSE_WAIT -
tcp 177 0 127.0.0.1:80 127.0.0.1:4121 CLOSE_WAIT -
netstat -atlunp|grep 80|grep CLOSE_WAIT|wc
3716 26012 405044
----查看当前进程打开了多少句柄数
# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
162 34255
162 33984
162 33525
162 33356
........
其中第一列是打开的句柄数,第二列是进程ID。
[root@itv-api_php_bj_syq_10_70_XX_XX www]# service nginx restart
Stopping nginx: [ OK ]
Starting nginx: nginx: [warn] conflicting server name "common.itv.cntv.cn" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "api.itv.cntv.cn" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "api.itv.cctv.com" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "newcomment.cntv.cn" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "common.newcomment.cntv.cn" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "newcomment.cctv.com" on 0.0.0.0:80, ignored
strace -f -p 56014 -p 56015 -p 56016 -p 56017 -p 56018 -p 56019 -p 56020 -p 56021 -p 56022 -p 56023 -p 56024 -p 56025
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Process 56015 attached - interrupt to quit
Process 56016 attached - interrupt to quit
Process 56017 attached - interrupt to quit
Process 56018 attached - interrupt to quit
Process 56019 attached - interrupt to quit
不是僵尸? 那就是孤儿
http://blog.csdn.net/wesleyluo/article/details/6079139
http://blog.chinaunix.net/uid-10257388-id-2967161.html
The system is going down for halt NOW!
====================================================
uptime
16:22:19 up 735 days, 5:48, 7 users, load average: 59.70, 58.29, 54.91
close_wait状态出现的原因是被动关闭方未关闭socket造成
tcp 179 0 127.0.0.1:80 127.0.0.1:4184 CLOSE_WAIT -
tcp 175 0 127.0.0.1:80 127.0.0.1:6038 CLOSE_WAIT -
tcp 177 0 127.0.0.1:80 127.0.0.1:4121 CLOSE_WAIT -
netstat -atlunp|grep 80|grep CLOSE_WAIT|wc
3716 26012 405044
----查看当前进程打开了多少句柄数
# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
162 34255
162 33984
162 33525
162 33356
........
其中第一列是打开的句柄数,第二列是进程ID。
[root@itv-api_php_bj_syq_10_70_XX_XX www]# service nginx restart
Stopping nginx: [ OK ]
Starting nginx: nginx: [warn] conflicting server name "common.itv.cntv.cn" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "api.itv.cntv.cn" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "api.itv.cctv.com" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "newcomment.cntv.cn" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "common.newcomment.cntv.cn" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "newcomment.cctv.com" on 0.0.0.0:80, ignored
strace -f -p 56014 -p 56015 -p 56016 -p 56017 -p 56018 -p 56019 -p 56020 -p 56021 -p 56022 -p 56023 -p 56024 -p 56025
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Process 56015 attached - interrupt to quit
Process 56016 attached - interrupt to quit
Process 56017 attached - interrupt to quit
Process 56018 attached - interrupt to quit
Process 56019 attached - interrupt to quit
不是僵尸? 那就是孤儿
http://blog.csdn.net/wesleyluo/article/details/6079139
http://blog.chinaunix.net/uid-10257388-id-2967161.html