如何解决 fatal: cannot exec ‘git-br’: Permission denied

不知道谁动了环境变量导致git alias无效

#找到git执行程序所在的目录
$ which git
/usr/bin/git

#查看一下当前的环境变量,的确没有/user/bin
$ echo $PATH
/home/magic/.composer/vendor/bin/:/usr/local/webserver/php/bin:/usr/local/node/bin:/usr/local/webserver/mysql/bin:/usr/local/mongodb/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/ffmpeg:/usr/local/go/bin:/gocode/bin:/home/magic/bin

#添加/user/bin进环境变量
$ PATH="$PATH:/usr/bin"
$ echo $PATH
/home/magic/.composer/vendor/bin/:/usr/local/webserver/php/bin:/usr/local/node/bin:/usr/local/webserver/mysql/bin:/usr/local/mongodb/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/ffmpeg:/usr/local/go/bin:/gocode/bin:/home/magic/bin:/usr/bin

成功解决 fatal: cannot exec ‘git-br’: Permission denied

git上添加了公钥,每次更新还是要提示输入密码的解决办法

问题:
每次执行git pull后会提示输入公钥密码

Enter passphrase for key '/root/.ssh/id_rsa':

解决办法参考:
http://askubuntu.com/questions/362280/enter-ssh-passphrase-once
依次执行:

$ssh-agent bash
$ssh-add /home/username/.ssh/id_rsa
Enter passphrase for /home/username/.ssh/id_rsa: 
Identity added: /home/username/.ssh/id_rsa (/home/username/.ssh/id_rsa)

输入密码后,出现Identity added后解决。

搭建git服务器

github私有仓库的费用太贵,有VPS可以自己搭建一个专属git服务器

其实没什么需要安装的,git的默认协议SSH不需要什么配置,主要是方便和安全方面的优化

初始化环境

为了安全,我们为git仓库专门设置一个管理用户git,约定使用 /srv/git 放置仓库

$ sudo useradd \
--create-home \
--home-dir=/srv/git \
--root=/srv/git \
--base-dir=/srv/git \
--shell=/usr/bin/git-shell \
git
$ sudo passwd git

上面的参数作用

--create-home --home-dir=/srv/git

创建用户主目录,将来可以添加SSH KEY登录方式,和代码仓库放在一起方便管理

--root=/srv/git

限制这个用户的访问目录在/srv/git,不能访问其它路径,这是出于安全考虑

--base-dir=/srv/git

用户base目录,即默认的父目录.帮助简化了克隆时的目录前缀

--shell=/usr/bin/git-shell

只允许用户用于管理仓库,不得执行其它命令

创建仓库

初始化一个裸仓库,即只包含仓库信息,不包含代码

$ sudo git --bare init /srv/git/MY_PROJECT.git

不需要其它配置了,就这么简单

从客户端克隆

MYHOST就是VPS的主机地址

$ git clone git@MYHOST:MY_PROJECT.git

主机名后的目录只需要填写仓库目录

这是创建用户时指定的 –base-dir 立的功,让你不用输入完整的目录 /srv/git/MY_PROJECT.git

尝试用git用户登录会被阻止

$ ssh git@MYHOST
git@MYHOST's password: 
fatal: Interactive git shell is not enabled.hint: ~/git-shell-commands should exist and have read and execute access.
Connection to MYHOST closed.

web界面

首先安装gitweb软件包,它附带了访问仓库的cgi动态程序.

gitweb默认需要在 /var/www/git 下放置cgi程序和仓库代码,但我们把仓库安装在了 /srv/git 下,所以做个软链接

# ln -s /srv/git /var/www/git
# yum install gitweb
# ls /var/www/git
gitweb.cgi static PROJECT.git

可以看到yum安装后多出了这两个: gitweb.cgi static

接下来启动gitweb服务

刚才安装的gitweb只是一套动态程序,HTTP访问还要借助lighttpd apache等web服务器.而git自带的命令instaweb可以自动创建web服务器的配置文件.指定–httpd参数为lighttpd即可

# sudo -i
# cd /var/www/git
# git init

# yum install lighttpd
# git instaweb --httpd=lighttpd --port=1234
No known browser available.
http://127.0.0.1:1234
上面的命令解释:
# sudo -i
# cd /var/www/git

因为 /var/www/git 是git用户的home目录,因此普通用户可能没有权限cd,所以需要-i参数保持root权限.

注意:git instaweb 不能指定document root目录,所以在哪个目录下执行,就展示那个目录下的仓库.因而需要先cd到这里

# git init

git instaweb创建的web服务器配置文件,需要一个git仓库来存放.

外界访问控制

到这里就可以访问git仓库了,但没有完,还需要外界可以访问,并且要限制访问.这时可以借助nginx,或者修改lighttpd的配置文件

server {
    listen 80;
    server_name git.MYHOST.COM
    location / {
        auth_basic "git web require auth";
        auth_basic_user_file /srv/etc/passwd;
        proxy_pass http://127.0.0.1:1234/;
    }
}

有关auth_basic的配置可以参阅 http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html

大功告成

到这一步就结束了,现在访问 http://git.MYHOST.COM/ 即可浏览仓库信息

如果你觉得这个web界面太丑陋的话,可以看看 https://github.com/kogakure/gitweb-theme ,这个项目提供了更优雅的主题界面:http://kogakure.github.io/gitweb-theme/

如何将使用ssh公钥添加到git

将公钥添一行一个添加到 /srv/git/.ssh/authorized_keys 即可

转自:小艾的博客

git-svn 如何更换了URL

随着Project的开发,可能SVN URL改变了(很多原因,比如域名改变,比如版本升级,再比如一不小心使用了http,想换到https等),那么如果使用SVN,很简单,直接relocate就可以了,但是以前同步使用的Git Project如何跟着变化了,上网查了一下,发现比较有效的来自下面。

https://git.wiki.kernel.org/articles/g/i/t/GitSvnSwitch_8828.html

【引用开始】

General Case

What immediately sprang to mind, and what was suggested e.g. on the mailing list, was to simply edit your .git/config, and change the url= in the section [svn-remote “svn”]. That doesn’t work, however. Instead, I found several suggestions to use variations of this theme:

l  Edit the svn-remote url URL in .git/config to point to the new domain name

l  Run git svn fetch – This needs to fetch at least one new revision from svn!

l  Change svn-remote url back to the original url

l  Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)

l  Change svn-remote url back to the new url

l  Run git svn rebase should now work again!

This will only work, if the git svn fetch step actually fetches anything! (Took me a while to discover that… I had to put in a dummy revision to our svn repository to make it happen!)

【引用结束】

注:红色部分请注意下。

本人已经验证这个方法是可以成功切换SVN URL的。

在Mac OS下 如何将git分支名显示在前面

先看下效果
git_branch_name

打开.bash_profile文件
如果没有先创建一个

$ touch ~/.bash_profile

打开文件并编辑

$ vim ~/.bash_profile

在最后面加入并保存并退出

# Git branch in prompt.
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* (.*)/ (1)/'
}
export PS1="u@h W[33[32m]$(parse_git_branch)[33[00m] $ "

最后别忘了让编辑的文件生效

source ~/.bash_profile

Notice:
[33[32m] 这部分设置分支的文本的颜色,如果你喜欢另一种颜色,修改斜杠内的色值。

git hooks pre-commit git挂钩防范于未然 提交前的自我检查

这几天抽空看了一下git文档,发现有个hooks的好东西,在开发过程中常常不小心会把一些不想提交的文件给提交进去,也常常在提交代码后发现 文件有语法错误,这样的提交一旦上线后很可能会导致正式环境出现严重的问题。

今天就说一下 pre-commit 这个hook,它会在你执行 git commit 操作的时候触发,如果该hook返回1,那么这次的 commit 将会被终止。

hook 位于 .git/hooks/ 目录下,可以看到很多 .sample 的文件这些都是示例文件,我们自己建一个 pre-commit 文件,里面可以写shell脚本,比如我写了一个检查php语法错误和config文件不可被提交进去的脚本

#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".

ROOT_DIR="$(pwd)/"
LIST=$(git diff-index --name-only --diff-filter=ACMR HEAD)
ERRORS_BUFFER=""
for file in $LIST
do
    EXTENSION=$(echo "$file" | grep "config.php$")
    if [ "$EXTENSION" != "" ]; then
        echo "注意:有config文件要提交!如果确定要提交可用 git commit --no-verify 来忽略";
        exit 1
    fi
    EXTENSION=$(echo "$file" | grep ".php$")
    if [ "$EXTENSION" != "" ]; then
        ERRORS=$(php -l $ROOT_DIR$file 2>&1 | grep "Parse error")
        if [ "$ERRORS" != "" ]; then
            if [ "$ERRORS_BUFFER" != "" ]; then
                ERRORS_BUFFER="$ERRORS_BUFFERn$ERRORS"
            else
                ERRORS_BUFFER="$ERRORS"
            fi
            echo "检测到有语法错误的php文件: $file "
        fi
    fi
done
if [ "$ERRORS_BUFFER" != "" ]; then
    echo
    echo "Found PHP parse errors: "
    echo -e $ERRORS_BUFFER
    echo
    echo "PHP parse errors found. Fix errors and commit again."
    exit 1
else
    echo "No PHP parse errors found. Committed successfully."
fi

大功告成,测试一下:

pre-commit

pre2

git reset 掉的代码如何找回

可以使用以下命令

git reflog
52a0ed7 HEAD@{25}: checkout: moving from vipv2 to 52a0ed74630feeb471e59d8d100304b61abcbce1^0
b6f1023 HEAD@{26}: commit: 抽奖消耗积分总计表
2621edf HEAD@{27}: rebase finished: returning to refs/heads/vipv2
2621edf HEAD@{28}: pull --rebase origin vipv2: vip抽奖算法、领取vip礼券
c428408 HEAD@{29}: checkout: moving from vipv2 to c4284082fa64a14bacc9b0fff07277fc911fdf5a^0
b1d4dd2 HEAD@{30}: commit: vip抽奖算法、领取vip礼券
1af22e3 HEAD@{31}: rebase finished: returning to refs/heads/vipv2
1af22e3 HEAD@{32}: checkout: moving from vipv2 to 1af22e3df26beb6294280c682d8faab13d2e4d93^0
926712d HEAD@{33}: rebase finished: returning to refs/heads/vipv2

找到丢失的提交号
然后最傻瓜的方式可以使用

 git cherry-pick b1d4dd2 

git push 相关

$ git push ssh://git@dev.lemote.com/rt4ls.git master // 把本地仓库提交到远程仓库的master分支中

$ git remote add origin ssh://git@dev.lemote.com/rt4ls.git
$ git push origin master
这两个操作是等价的,第二个操作的第一行的意思是添加一个标记,让origin指向ssh://git@dev.lemote.com/rt4ls.git,也就是说你操 作origin的时候,实际上就是在操作ssh://git@dev.lemote.com/rt4ls.git。origin在这里完全可以理解为后者 的别名。
需要说明的是,默认情况下这条语句等价于提交本地的master仓库到远程仓库,并作为远程的master分支。
如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,那么可以这么做。

$ git push origin test:master // 提交本地test分支作为远程的master分支
$ git push origin test:test // 提交本地test分支作为远程的test分支

如果想删除远程的分支呢?类似于上面,如果:左边的分支为空,那么将删除:右边的远程的分支。
$ git push origin :test // 刚提交到远程的test将被删除,但是本地还会保存的,不用担心

$ git checkout –orphan name //创建一个空分支

生成 SSH KEY

$ cd ~/.ssh    //检查计算机ssh密钥

如果没有提示:No such file or directory 说明你不是第一次使用git,执行下面的操作,清理原有ssh密钥

 $ ls 
 config id_rsa id_rsa.pub known_hosts
 $ mkdir key_backup
 $ cp id_rsa* key_backup
 $ rm id_rsa*

获得密钥:

ssh-keygen -t rsa -C "xxxxx@gmail.com"//填写email地址,然后一直“回车”ok

打开本地..\.ssh\id_rsa.pub文件。此文件里面内容为刚才生成人密钥。