0%

linux系统上可以指定ls选项--group-directories-first,但是mac系统上的ls命令没有此选项。

有两个方法:

  • 使用grep过滤
    定义别名:
    1
    alias ll='ls -lh grep ^total && ls -lh grep ^d && ls -lh grep -v ^d grep -v ^total'
  • 使用gnu ls
    安装gnu版本的命令:
    1
    $ brew install coreutils
    定义别名:
    1
    alias ls="gls -p --color=auto --group-directories-first"

1
2
3
4
5
6
7
8
$ brew install postgresql
...
To have launchd start postgresql at login:
ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
Then to load postgresql now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Or, if you don't want/need launchctl, you can just run:
postgres -D /usr/local/var/postgres

Mac OS X更改主机名 sudo scutil --set HostName new_hostname

firefox在linux下窗口最大化时,tabs bar并不会与title bar合并,所以会比较浪费屏幕空间。如果想最大化的节省屏幕空间可以使用pentadactyl,适合vim控,连地址栏都不会显示。还有一个插件叫HTitle,也可以隐藏掉标题栏。

rebase顾名思义re base,重设基准,也就是重设当前分支的基准,rebase又叫做”衍合”。

git分支都有一个起始点,是从某个commit起始分支出来的。rebase时指定新的分支起始点,git会将当前的分支的所有改变以新的起始点为基准重新计算,计算出相对于新的分支起始点的所有改变之后,将这些改变在新的分支起始点上重放,会生成新的commits,最后将当前分支的头设定到新生成的commits的最后一个上。

实际上就将当前分支嫁接到了新的分支起始点上。rebase可以使提交历史看起来更干净。

rebase还可以用来修改当前分支的历史提交信息,修改历史提交代码,合并或拆分提交,调整提交的历史顺序,甚至删除历史提交,总之这个命令是强大无比。

选定当前分支的一个上游提交,然后使用参数-i进入交互模式Interactive Mode

1
$ git rebase -i <upstream>

然后git会用默认编辑器打开一个调整commit的界面,类似如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
pick 1517205 测试 
pick 5163c4c 测试
pick 3e58114 测试
pick fb07146 测试
pick ebd546c 删除测试
pick bf2466e 添加分支流程服务
pick 84e52d3 添加同步流程分布

# Rebase ebd5cdd..84e52d3 onto ebd5cdd
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

各个命令的解释:

  • pick
    保留这个提交,不做任何修改
  • reword
    修改本条提交的提交信息,其他不做修改
  • edit
    保留这个提交,并修改提交的实际内容
  • squash
    与上一条提交合并,保留本条提交的提交信息
  • fixup
    与squash差不多,除了舍弃本条的提交信息
  • exec
    使用shell执行exec行除exec关键字之后的命令

如果想删除某个提交,将pick那行完整删除即可。如果将所有的行全部移除,rebase将会终止。
参考[2]图文并茂的展示了git rebase的强大威力。

使用rebase必须遵守的一个规则:

一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合(rebase)操作。
如果你遵循这条金科玉律,就不会出差错。否则,人民群众会仇恨你,你的朋友和家人也会嘲笑你,唾弃你。

References:
[1]分支的衍合
[2]Git-rebase 小筆記
[3]Git 学习笔记:git-rebase 命令

===
[erq]

即时文档(heredoc)的界定符是可以自定义的,但一般习惯上使用EOF。
界定符的终止符有一个限制,终止符必须放到行首,后面也不能有任何空白,有时候不缩进会很不美观。

这时候可以这样来使终止符EOF可以使用TAB缩进:

1
2
3
4
echo
cat <<-EOF
test
EOF

在设定终止符时加一个横线,也就是使用<<-
但这里还有一个坑,即使是这样写,EOF缩进时也只能使用TAB字符而不能使用任何其他空白字符。
我的vim配置里使用了expandtab来将tab自动替换为空格,因此踩上了这个大坑,无论如何都提示错误:

1
2
warning: here-document at line xxx delimited by end-of-file (wanted \`EOF')
syntax error: unexpected end of file

这时候只要输入真正的TAB字符就可以了,Ctrl+V+TAB,windows下要用Ctrl+Q+TAB

===
[erq]

查看远程分支

1
2
3
4
5
6
7
8
9
$ git branch -av
* devel 86e9595 Merge branch 'guoqiang' into devel
lifeng dbd7a71 增加流程图绘制菜单
remotes/origin/HEAD -> origin/devel
remotes/origin/devel 86e9595 Merge branch 'guoqiang' into devel
remotes/origin/lifeng dbd7a71 增加流程图绘制菜单
remotes/origin/master d025ce0 Merge branch 'devel'
remotes/origin/minli 1fa16ba 'test'
remotes/origin/zjl 72aa56a test2

远程分支会用红颜色显示

删除远程分支

1
$ git branch -r -d origin/branch-name

或者推送一个空的分支到远程分支

1
$ git push origin :branch_to_delete

删除远程tag

1
$ git push origin --delete tag tag_to_delete

或者用一个空的tag覆盖远程tag

1
$ git push origin :refs/tags/tag_to_delete

重命名远程分支
先删除远程分支,然后重命名本地分支,然后将重命名后的分支推送到远程。

1
$ git branch -m old_name new_name

本地tag推送到远程

1
$ git push --tags

获取远程tag

1
$ git fetch origin tag tag_name

References:
[1]GIT查看、删除、重命名远程分支和TAG

===
[erq]

reset和revert都可以修改历史提交,但二者的区别是很大的。

reset
git reset - Reset current HEAD to the specified state

对于撤销提交,git reset的命令格式如下:

1
$ git reset \[--soft --mixed --hard --merge --keep\] \[-q\] \[<commit>\]

这种形式的reset会将当前分支的头设置到指定的commit,并且根据不同的模式可能会更新索引区域(使用指定commit的目录树)和工作树。如果省略模式参数,则默认为--mixed,模式只能设置为以下值之一:

  • --soft
    不修改索引区域(staging area)和工作目录(woring tree),直接将当前分支的头设置为commit。
  • --mixed
    使用commit的目录树重置索引区域,当前工作树保持不变。因此工作树中修改的文件需要重新添加到索引区域才能提交。
  • --hard
    使用commit的目录树重设索引区域和工作树。完全丢弃commit之后的所有修改。
  • --merge
    使用commit的目录树重设索引区域,并且更新工作树中在commit和HEAD之间存在差异的文件,但是不更新工作树中索引区域与工作树之间存在差异的文件。
    如果一个文件在commit和有修改但未将修改更新到索引区域的文件之间存在差异,则撤销会被终止。
  • --keep
    使用commit的目录树重设索引区域,并且更新工作树中在commit和HEAD之间存在差异的文件。

revert

1
$ git revert <commit>...

git revert用于反转提交,执行evert命令时要求工作树必须是干净的。git revert用一个新提交来消除一个历史提交所做的任何修改。

区别

reset会将历史提交直接撤销掉,不会保留提交历史。而revert会增加一个新的提交来反转指定的历史提交所做的修改,保留完整的提交历史,但被反转的提交相当于没对代码库做任何修改。简单来说,一次提交修改了代码库,revert后另一个提交把对应的修改恢复了原样。

如果comit已经push到远程服务器,要慎用甚至最好不要用reset来撤销修改,除非你真的知道你在做什么。这时候用revert是比较合适的。如果这时候执行git push,会有错误提示:

1
2
3
4
5
6
7
To gitsvr:xxx
! \[rejected\] devel -> devel (non-fast-forward)
error: failed to push some refs to 'gitsvr:xxx'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

如果你确信你push到远程服务器的提交没有别人在引用,比如就你自己在使用代码库,可以强制更新远程代码库:

1
$ git push -f

如果你的强制撤销会影响到别人,就应该使用git revert了。

git reset后悔药

git reset后还能恢复吗?只要提交对象还在代码库中存在就可以恢复,因为只不过是HEAD指针被移动了而已,可以重新移动到原来的提交对象。
使用git reflog查看操作历史,找到之前 HEAD 的 hash 值,然后git reset --hard到那个hash就可以了。

References:
[1]man git

===
[erq]

系统为mavericks

下载Mac OS X(Cocoa 64)版本的Eclipse IDE for Java EE Developers,当前版本为Kepler。

然后将其解压到/opt目录下就算完成了安装

1
2
# mkdir /opt
$ sudo tar zxvf ~/Downloads/eclipse-jee-kepler-SR2-macosx-cocoa-x86_64.tar.gz -C /opt

安装自带了Eclipse.app,将其从finder中拖到dock中的Lauchpad图标上就可以将其加入到Lauchpad中,也可以直接将其拖到dock中。或许将其直接拖放到Applications文件夹中也可以。

===
[erq]

mac与linux一样,1024以下的端口为特权端口,只有root用户才有权监听。

因此要使用80端口要么使用root启动tomcat,要么使用端口转发。

使用ipfw(Internet Protocol Firewall)设置端口转发

1
# ipfw add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in

不过ipfw已经被标记为废弃状态。

使用pf(packet filter)设置端口转发

  1. 创建anchor文件
    /etc/pf.anchors/tomcat
    1
    rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080
  2. 测试anchor文件
    1
    # pfctl -vnf /etc/pf.anchors/tomcat
  3. 添加到主配置文件
    pf启动时会自动装载/etc/pf.conf文件,因此将anchor文件链接到/etc/pf.conf,转发规则就会自动建立了。
    1
    2
    rdr-anchor "tomcat-forwarding"
    load anchor "tomcat-forwarding" from "/etc/pf.anchors/tomcat"
    注意要紧随文件中现有的rdr-anchor后面添加上面两行
  4. 打开pf
    pf默认是关闭的。可以使用以下命令启动pf:
    1
    # pfctl -ef /etc/pf.conf
    也可以使用其他配置文件启动pf。

也可以修改LaunchDaemons来使pf开机自动打开。
/System/Library/LaunchDaemons/com.apple.pfctl.plist
[xml]
ProgramArguments

pfctl
-e
-f
/etc/pf.conf

[/xml]
添加的为-e参数,即enable。
有一点一定要注意,-f和/etc/pf.conf这两个参数不能被打断,因为-f必须紧跟一个文件参数,所以说添加-e参数时不要打断-f参数,否则开机不会自动启动pf,切记。

  1. 跨接口转发
    如果需要跨接口转发,则需设置系统参数:
    /etc/sysctl.conf
    1
    2
    net.inet.ip.forwarding=1
    net.inet6.ip6.forwarding=1
    这与linux一致。

References:
[1]Port Forwarding in Mavericks

===
[erq]