东东东 陈煜东的博客

标签存档: git

git bash 遇到的一些问题

使用了 git windows 客户端遇到的一些问题记录。

$ git --version
git version 2.11.0.windows.1

退格键无法工作

升级了一下git的 Windows 客户端,默认操作都是使用 git-bash.exe 来进行命令行的使用的。但是例如 PyCharm 里面带的 Terminal 用的是 git-bash.bat 这里面的效果。遇到了很尴尬的问题,方向键和退格键都无法使用。

看了这个帖子修改了一下可以使用方向键和退格键了。 http://superuser.com/a/683405

git-bash.bat 开头的一些地方加了下面的一段话。

SET TERM=cygwin

git bash 中文乱码

ls 文件的时候出现

''$'\345\217\221\344\277\241\346\201\257''.txt'

类似的编码,使用一下的东西,好像也没怎么改动。在git-bash.exe 中就中文显示正常了,但是 PyCharm 里面的那个还是有问题。

# disable/enable 8bit input
set input-meta on
#set output-meta on
set output-meta on
set convert-meta off
#set convert-meta off

分类: 实用技巧

git与svn 共舞

Git好用,但无奈历史原因,整个项目还得继续使用svn,但是又想使用Git的特性,所以尽力地去追求Git与svn的协作。

git svn命令

Git 中所有 Subversion 桥接命令的基础是 git svn 。所有的命令都从它开始。相关的命令数目不少,本文不过多介绍git svn的命令使用,只简单的说明一下最常用的几个,更多的知识参考书记pro git。

整理用户名与Email的映射

在 Subversion,每个提交者在都在主机上有一个用户名,记录在提交信息中。如果想让已有的信息更好的映射到 Git 作者数据里,则需要 从 Subversion 用户名到 Git 作者的一个映射关系,因为Git是用邮箱来标识一个提交者的。建立一个叫做 user.txt 的文件,每行一条svn作者 = 作者昵称 <邮箱地址>,用如下格式表示映射关系

schacon = Scott Chacon <schacon@geemail.com>
selse = Someo Nelse <selse@geemail.com>

SVN代码的所有提交者的作者名可以通过以下命令获得:

svn log --xml | grep "^<author" | sort -u |  \
         awk -F '\<author\>' '{print $2}' | awk -F '\</author\>' '{print $1}' > user.txt

得到以下文本,然后根据以上的格式编辑作者的邮件信息等。

schacon
selse

这样我们的把有svn的提交记录的作者、邮箱user.txt都准备好了,接下来就克隆svn的地址。

克隆svn的trunk到本地

git svn clone http://example.com/path/to/project-x/trunk   \ 
              --authors-file=users.txt  project-x
  • http://example.com/path/to/project-x/trunk是svn的项目地址,这里用了trunk的目录。
  • --authors-file=users.txt是指明svn的作者信息,git要用到。
  • project-x是文件夹名字
  • --no-metadata参数可以不要svn的信息,适合迁移的时候使用,不适合git svn共用,见下面的小节

如果你的项目很大,这一步是非常缓慢的。因为Git会去把整个提交记录遍历过去,然后对svn的每次提交多做一个补丁,产生一个git提交。特别是到了84000的时候感觉是假死的情况,其实只要慢慢等待就可以了。

no-metadata去除不爽的git与svn的关联信息

使用这个参数,请认真阅读本片段。

如果没有使用 --no-metadata来克隆svn项目,那么如果输入git log将会看到一堆“没用的东西”:

commit 37efa680e8473b615de980fa935944215428a35a
Author: schacon <schacon@4c93b258-373f-11de-be05-5f7a86268029>
Date:   Sun May 3 00:12:22 2009 +0000

    fixed install - go to trunk

    git-svn-id: https://my-project.googlecode.com/svn/trunk@94 4c93b258-373f-11de-
    be05-5f7a86268029

如果使用--no-metadata参数,那么得到的提交信息是这样的:

commit 03a8785f44c8ea5cdb0e8834b7c8e6c469be2ff2
Author: Scott Chacon <schacon@geemail.com>
Date:   Sun May 3 00:12:22 2009 +0000

    fixed install - go to trunk

是不是变得清爽了呢?那么git-svn-id这个东西到底是做什么用的呢?

原来git-svn-id是记录git的提交与svn的提交的关联关系。如果没有这个,那么你只能在git上的提交,无法提交到svn。

建议:如果是你想向svn提交,那么不要使用这个参数。如果你只是迁移svn的历史记录到Git中,那么请开启这个参数。

设置Git的参数

之前我们把svn的代码拉取到本地来了,接下来要设置一下远程仓库的配置

cd project-x

# 设置远程仓库的url地址,如果你的是ssh的方式,又可能不一样了。
git remote add origin http://git.code.com/url/project-x.git

# 设置git的提交用户名和邮箱
# --global参数是全局设定,如果是想当前项目设置,那么去除这个参数
git config --global user.name youname
git config --global user.email email@email.com

从svn获取更新

刚刚我们git svn clone下载了svn的源码,但是如果有人提交了svn的代码,那么我们这个时候还要继续拉取svn的代码。

# 从svn拉取代码。这个事实拉取代码到本地,并没有合并到本地的分支来。
git svn fetch
git checkout master
git svn rebase
# svn update = git svn fetch + git svn rebase

这里检出master分支,去做一次拉取svn并合并代码的操作,理想的情况下使用其他的分支,不一定是master分支。 然后用rebase把提交记录应用到分支上,构成一个线性的提价记录。

我有好多个分支怎么办?

我们一开始都默认值选择了一个分支,我如果想获取多个分支怎么处理呢?

向svn提交代码

假设你在分支feature分支上做开发,没有提交到master分支上。那么有两种方法提交到svn。

  • 保留feature分支所有的提交记录
  • 压缩feature分支的提交记录,变成一个提交记录。

保留个人的提交记录

svn和git分支概念不一样,你要把git的提交推动到svn的代码库中也非常的简单。只需要使用rebase命令到跟踪svn的那个分支上就可以了。然后执行dcommit提交到svn服务器。

git checkout master  # 先拉取svn的代码
git svn rebase
git checkout feature123  # rebase 到master分支上
git rebase master
git checkout master
git merge feature123   # 使用fast-forward合并,让master指针指向最新的提交
git svn dcommit        # 推送到svn服务器

压缩个人的提交记录

和上一种提交没有什么区别。唯一的区别就是在如果你拉取了一个分支feature123,并且没有人在master上面做任何的提交,那么可以使用merge来进行fast-forward快速合并(这样子是不会压缩为一个提交记录的)。然后提交到服务器。

另外一种情况是,他人在svn的分支上提交代码了,你也在master的基础上提交代码了。这个时候git没办法进行fast-forward快速合并,只能进行merge 三方合并。这个时候会把之前的提交记录变成一个提交。然后推送到服务器上。

git checkout master  # 先拉取svn的代码
git svn rebase
git merge feature123     # 这里可能是fast-forward合并,也可能是三方合并。
git svn dcommit          # 推送到svn服务器

使用心得

git与svn协同,这种方式用的比较麻烦,又要使用svn又要使用git。只是有这种需求的人,都是项目还在svn管理。建议将整个项目使用git提交信息,但是最后推送到svn的tag目录下。

参考

分类: 实用技巧

在公司的局域网使用git或github 设置代理

在公司这样的局域网环境中,向要走网络必须走HTTP代理出去。不能直接访问外面的服务,所以这样安全了些,但是也提供了不便的地方。因此需要设置一些代理才能使用。

常用的代理有:

  • HTTP、HTTPS代理 许多程序支持http代理
  • SOCKS代理 不是所有的程序都支持socks代理,但是常用的软件都支持

github上的仓库支持ssh、https、git三种协议的chekout(clone)操作。

生成SSH Key

参考http://www.chenyudong.com/archives/ssh-using-private-public-key-no-password.html进行SSH密钥的生产

git使用http访问

github上可以使用https进行访问。

$ git config --global http.proxy http://web-proxy.oa.com:8080

但是这样可以clone了。但是如果要push代码,那就麻烦了。每次都需要输入密码。

git使用ssh进行访问

使用ssh协议不仅可以访问github,还可以访问我们自己的git私有仓库,可以参考文章通过SSH创建私有git仓库

首先,Windows用户先下载一个mysgit客户端,下个portable版的就好了,https://github.com/msysgit/msysgit/releases里面有git程序。Linux用户跳过。

第二步,配置ssh。Windows用户运行mysgit中的git-bash.bat来启动终端。编辑vim ~/.ssh/config ,将下面的内容写入到文件中

Host github.com *.github.com
    ProxyCommand connect -H web-proxy.oa.com:8080 %h %p   #设置代理
    IdentityFile ~/.ssh/privatekey/id_rsa.github
    User git

ProxyCommand说明了设置代理,其中connect是个程序,Windows用户下载了mysgit,里面有这个程序,Linux用户可能没有,需要安装sudo apt-get install connect-proxy

如果你使用corkscrew,那么解压缩附件,把corkscrew.exe和cygwin1.dll拷贝到mysgit的bin目录中。附:corkscrew.zip

第三步,测试

ssh -T git@github.com
Hi username! You've successfully authenticated, but GitHub does not provide shell access.

分类: Programming

使用git同步管理自己的网站

在本地修改网站的文件,如果需要使用ftp上传,太麻烦,如果文件一多,也不知道哪个文件应该上传。而且网站使用了git作为项目管理,每个人都可以对网站进行更改,我如果改了,对方也改了,就不容易区分了。所以git的项目管理是很容易看出来哪里的文件发生变化的。

前面有说到使用通过SSH创建私有git仓库文章,此处在服务器上创建了一个公共的仓库,里面只是存放着文件的更改记录,没有一个文件结构直接显示在服务器的文件夹中。我们可以看本地的文件树,一个project里有.git文件夹,里面存放着更改记录。然后还有我们的具体的project的源代码。但是git服务器只存放着.git里的内容,没有本地的源代码结构。所以没办法直接更新网页。

但是有个方法,既然我们的git历史记录在服务器上保存着,而且我们可以从git仓库中check out出来源代码到服务器上,这样我们在本地push,然后在服务器上使用check out,就可以改变网页的文件了。

具体步骤。

在服务器上配置

第一步,新建一个git私有仓库test.git。可以参考文章http://www.chenyudong.com/archives/git-over-ssh-create-private-repository.html。

$ mkdir /home/www.chenyudong.com/www.chenyudong.com.git #将来网站git的记录存放位置
$ chown -R git:git www.chenyudong.com.git #改权限
$ cd www.chenyudong.com.git
$ git init --bare
Initialized empty Git repository in /home/www.chenyudong.com/www.chenyudong.com.git/

第二步,当客户端push到服务器来时,自动更新某个文件夹。

$ mkdir /home/www.chenyudong.com/WebRoot #网站的目录地址
$ vi hooks/post-receive #新建文件,输入以下内容
#!/bin/sh
GIT_WORK_TREE=/home/www.chenyudong.com/WebRoot git checkout -f
# or GIT_WORK_TREE=../WebRoot git checkout -f
$ chmod +x hooks/post-receive #添加可执行权限

post-receive这个脚本在提交文件到git仓库时,会运行文件内的代码,所以通过这样的方法,我们在客户端push提交代码后,就能自动更新网站的文件了。

在本地客户端配置

第一步,参考上边的文章,新建一个本地的仓库。

第二步,commit文件。

第三步,push文件到服务器上。在远端地址写入ssh://git@ca.daoiqi.com/~/www.chenyudong.com.git,然后输入密码,push后,就可以发现服务器下的那个文件夹发生变化了。

这样的方法,适用于php等解释性的语言,在运行时,直接靠解释器来编译运行。如果你是编写jsp页面,那么你提交的只有java文件和jsp文件,而运行的时class文件,那么就需要将java文件编译成class文件。只有在git服务器上,提交代码后,自动编译成class文件才行。我觉得可以使用ant来编译、胡或者写个bash程序。

分类: Linux

eclipse使用egit提交到github上

第一步,在系统上安装git,配置环境变量。下载一个Git for Windows的msysgit,我们下载一个PortableGit,我是64bit系统,我下载的PortableGit-1.8.0-preview20121022.7z,没出现什么问题。这个东西免安装,解压缩到目录下就好了。然后添加一下环境变量。

第二步,生成一个ssh 的公钥和私钥。教程可以查看https://help.github.com/articles/generating-ssh-keys#platform-windows。经过这个步骤后,产生id_rsa(私钥)和id_rsa.pub(公钥)。已经能和github通信了。

第三步,在github创建一个自己的Repository源仓库。

第四步,安装egit。

第五步,新建或者用已存在的project。右键project->team>commit,在本地创建一个仓库,并提交到本地。

第六步,提交到github。因为上一步已经在本地创建好一个仓库了,我们只要提交到github上就行。右键project->team->remote->push。在新窗口中,填写git@github.com:daoiqi/repo.git,其他默认就行了,点击Next,因为第一次提交,选择branch提交。

提交到github

这样,在github上就能看到这个project了。

分类: Linux

通过SSH创建私有git仓库

开源的代码能找到第三方的git仓库存放代码,但是私有的代码却不能放在那上面。而且对于免费私有的git仓库来说,还是比较不方便的。

有了自己的Linux服务器,那么就可以自己创建一个私有的git仓库了。接下来,就讲讲如何创建自己的私有的git仓库。

在Linux服务器上

第一步,先创建一个专门由于git仓库的一个账号吧,这样也方便进行管理。可以参考这篇文章Linux新建用户的命令

#新建一个git用户组
sudo groupadd git

#新建一个git用户,创建目录,并禁止shell登录,添加到git用户组
sudo useradd git -m -s /sbin/nologin -d /home/git -g git 

第二步,新建一个git仓库,这个仓库叫“git bare repository”,git裸仓库。

$ mkdir repo.git
$ chown -R git:git repo.git #改权限
$ cd repo.git
$ git --bare init
Initialized empty Git repository in /home/ams/repo.git/

这个仓库和本地的那个不一样,可以发现本地的那个仓库有在project下有一个.git的目录,而project下还有自己的代码。但是这个git裸仓库它没有自己的project,他只有和本地.git目录下一样的内容。

在客户端下

使用TortoiseGit图形界面,使用portable git内核。

第一步,右键目录,选择git 克隆,然后如图设置

git clone 仓库

第二步,在确定后,会出来一个密码提示框,让输入密码。

第三步,就等待下载结束,这样本地就能有一个本地仓库了。

总结:这样一个最简单简易的git私有仓库就建好了,本地可以继续向服务器提交代码,但是也需要密码才能。

分类: Linux

Copyright © 2017 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑