如何阻止gitlab new branch中的new peoject

16685人阅读
参考(26)
linux(35)
性能(19)
本文主要参考文档:/gitlabhq/gitlabhq/blob/5-0-stable/doc/install/installation.md
Debian/Ubuntu主要参考/gitlabhq/gitlabhq/blob/5-0-stable/doc/install/installation.md
Centos主要参考下文内容,辅助参考/gitlabhq/gitlabhq/blob/5-0-stable/doc/install/installation.md
安装步骤总览
1.安装依赖包
2.安装Ruby
3.创建Git用户
4.安装GitLab-Shell
5.配置数据库
6.安装GitLab
7.启动GitLab
1.安装依赖库
yum install -y wget curl gcc checkinstall libxml2-dev libxslt-dev sqlite3 libsqlite3-dev libcurl4-openssl-dev libreadline6-dev libc6-dev libssl-dev libmysql++-dev make build-essential zlib1g-dev libicu-dev redis-server openssh-server git-core python-dev python-pip libyaml-dev postfix
yum install libicu-devel mysql-devel pcre-devel
安装python,官方要求版本必须在2.5以上,而且不支持3.0。
yum install python安装完查看下版本python --version还要确保python2命令有效python2 --version如果提示
bash: python2: 未找到命令 ,那你需要link一下sudo ln -s /usr/bin/python /usr/bin/python2
系统自带旧版本python被严重依赖时,就不要卸载旧版本python,直接安装新版本python即可。
wget http://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz
tar zxvf Python-2.7.6.tgz
cd Python-2.7.6
./configure --prefix=/usr/bin/python2.7
make install查看python是否正常/usr/bin/python2.7/bin/python2.7 -V
创建一个连接是系统默认python变为python2.7
ln -s /usr/bin/python2.7/bin/python2.7 /usr/bin/python
2.安装Ruby
!!!注意:
在安装Ruby之前需要先安装libyaml,如果没先安装libyaml,后期执行 bundle exec rake
gitlab:setup RAILS_ENV=production ,会报 can't dump anonymous class Class 错误。
安装 libyaml
wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
tar xzvf yaml-0.1.4.tar.gz
cd yaml-0.1.4
./configure --prefix=/usr/local
make install安装 Ruby 1.9.3-p0
wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p0.tar.gz
tar xzvf ruby-1.9.3-p0.tar.gz
cd ruby-1.9.3-p0
./configure --prefix=/usr/local --enable-shared --disable-install-doc --with-opt-dir=/usr/local/lib
make install
!!!注意:
Ruby 1.9.3-p0执行 make 时,会出现 ossl_pkey_ec.c 错误,
解决方法:
vi ext/openssl/ossl_pkey_ec.c
#此文件放置在ruby-1.9.3-p0目录下
#在method = EC_GFp_nist_method();下一行新增 #if !defined(OPENSSL_NO_EC2M)
#在method =
EC_GFp_simple_method();下一行新增 #endif
if (id == s_GFp_simple) {
method = EC_GFp_simple_method();
} else if (id == s_GFp_mont) {
method = EC_GFp_mont_method();
} else if (id == s_GFp_nist) {
method = EC_GFp_nist_method();
#if !defined(OPENSSL_NO_EC2M)
} else if (id == s_GF2m_simple) {
method = EC_GF2m_simple_method();
#在new_curve = EC_GROUP_new_curve_GFp;下一行新增 #if !defined(OPENSSL_NO_EC2M)
#在new_curve = EC_GROUP_new_curve_GF2m;下一行新增 #endif
if (id == s_GFp) {
new_curve = EC_GROUP_new_curve_GFp;
#if !defined(OPENSSL_NO_EC2M)
} else if (id == s_GF2m) {
new_curve = EC_GROUP_new_curve_GF2m;
ossl_raise(rb_eArgError, &unknown symbol, must be :GFp or :GF2m&);
安装完成后,执行 ruby -v 查看ruby版本,执行gem -v 查看gem版本(执行完毕如果只出现版本而不是提示需要安装libyaml,证明libyaml安装成功)
安装 Bundler
sudo gem install bundler
3.创建Git用户
创建一个 git 用户供GitLab使用
adduser --comment 'GitLab' git
让git用户无密码登陆
sudo chmod 644 /etc/shadow vim /etc/shadow
这里感觉 664 权限不够用那就改为 777 权限
去掉用户的感叹号
git:!!:99:7::: 修改为 git::99:7:::
加入sudo组
chmod u+w /etc/sudoers
vim /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
git ALL=(ALL) ALL #加入这行
4.安装GitLab-Shell
切换到git用户
克隆GitLab-Shell
git clone /gitlabhq/gitlab-shell.git
cd gitlab-shell切换到最新的分支
git checkout v1.2.0 生成配置文件
cp config.yml.example config.yml更改配置信息,一般就改下你部署的域名地址gitlab_urlvim config.yml
# Url to gitlab instance. Used for api calls. Should be ends with slash.
gitlab_url: &http://localhost/& #改成你的域名或者IP安装./bin/install
5.配置数据库
gitlab支持mysql和postgresql,这里以mysql为例,postgresql会比较麻烦!
切换回root用户
没安装过mysql及开发包的情况
安装mysql及开发包
yum install -y mysql-server mysql mysql-devel
安装过mysql及开发包的情况,省略上边的mysq安装。
启动数据库
service mysqld start
#或 /etc/init.d/mysql.server start等初始化GitLab数据库
!!!注意:
注意1,执行 mysql -u root -p Enter password:时报ERROR 2002 (HY000): Can’t connect to
local MySQL server through socket ‘/var/lib/mysql/mysql.sock错误,
因为sock文件存放有时不是指向 /var/lib/mysql目录下的(安装方式不同,sock文件存放位置不同),
使用& ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock 加个连接。
注意2,创建用户后,想修改用户的密码,
如,创建用户user01,CREATE USER user01@'localhost' IDENTIFIED BY 'password1';& 修改用户
user01密码,SET PASSWORD FOR 'user01'@'localhost' = PASSWORD('password2');
初始化GitLab数据库
mysql -u root -p
Enter password:
Welcome to the MySQL monitor.
Your MySQL connection id is 2
Server version: 5.5.30 MySQL Community Server (GPL)
Copyright (c) , Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names
may be trademarks of their respective owners.
Type '' or '\h' for help. Type '\c' to clear the current input statement.
mysql& CREATE USER 'gitlab'@'localhost' IDENTIFIED BY 'gitlab';
Query OK, 0 rows affected (0.01 sec)
mysql& CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8`
COLLATE `utf8_unicode_ci`;
Query OK, 1 row affected (0.00 sec)
mysql& GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON
`gitlabhq_production`.* TO 'gitlab'@'localhost';
Query OK, 0 rows affected (0.00 sec)
Bye测试gitlab用户连接mysqlsudo -u git -H mysql -u gitlab -p -D gitlabhq_production
!!!注意:
这里可能报& sudo: /etc/sudoers is mode 0640, should be 0440 错误
解决方法:root用户 chmod 0440 /etc/sudoers
6.安装GitLab
终于到GitLab的安装了,进入git用户
cd ~/克隆GitLabsudo -u git -H git clone /gitlabhq/gitlabhq.git gitlab
cd gitlab切换到5.0稳定分支sudo -u git -H git checkout 5-0-stable配置
cd /home/git/gitlab
# 用样例配置生成gitlab配置&
sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml # 更改域名&sudo -u git -H vim config/gitlab.yml
# 确保gitlab对 log/ 和 tmp/ 目录有写权限
sudo chown -R git log/
sudo chown -R git tmp/
sudo chmod -R u+rwX log/
sudo chmod -R u+rwX tmp/ # 创建附属目录&sudo -u git -H mkdir /home/git/gitlab-satellites
# 创建pids目录并确保对gitlab可写
sudo -u git -H mkdir tmp/pids/
sudo chmod -R u+rwX tmp/pids/ # 生成Unicorn配置&sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb配置GitLab DB设置# Mysql
sudo -u git cp config/database.yml.mysql config/database.yml安装Gemscd /home/git/gitlab
sudo gem install charlock_holmes --version '0.6.9'
# For MySQL (note, the option says &without&)
bundle install --deployment --without development test postgres
!!!注意:
安装Gems中执行 bundle install --deployment --without development test postgres ,会卡住很长时间,几个小时甚至更多,
原因,gem sources 是 https://rubygems.org/ ,解决,gem sources 改为 http://ruby.taobao.org/
!!!注意:
执行 bundle install --deployment --without development test postgres 命令时会出现各种匪夷所思的错误,到时候别着急,慢慢来。
先整体看看此命令执行后显示(非常重要),有可能是库缺失,如出现
An error occurred while installing nokogiri (1.6.0), and Bundler cannot continue.Make sure that `gem install nokogiri -v '1.6.0'` succeeds before bundling.
可能就是libxml2、libxslt库缺失,显示会有libxml2& is missing libxslt is missing等
sudo yum install -y gcc ruby-devel libxml2 libxml2-devel libxslt libxslt-devel
yum&&install&patch&gcc-c++&readline-devel&zlib-devel&libffi-devel&openssl-devel&make&autoconf&automake&libtool&bison&libxml2-devel&libxslt-devel&libyaml-devel&
这里关键是不要慌,看完执行后全部显示。
修改方式 ,
vi /home/git/gitlab/Gemfile
source &http://ruby.taobao.org&
// 旧 source &http://rubygems.org/&初始化数据并激活高级特性
首先编辑/home/git/gitlab/config/database.yml
# PRODUCTION
production:
adapter: mysql2
encoding: utf8
reconnect: false
database: gitlabhq_production
username: root
password: &secure password& #更改为你mysql的root用户密码
# host: localhost
# socket: /tmp/mysql.sock
bundle exec rake gitlab:setup RAILS_ENV=production!!!注意:
报错,提示 can't dump anonymous class Class,检查第二步 Ruby 时,libyaml是否优先安装
报错,提示 rake aborted! getaddrinfo: Name or service not known,检查你的hosts, /etc/hosts 中 127.0.0.1 对应是否有localhost
报错,提示Error connecting to Redis on localhost:6379 (ECONNREFUSED),
解决办法,切换到root,安装Redis
-ivh&http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
别忘了安装yum install yum-priorities
yum install redis*
#启动redis
service redis start 重新执行rakebundle exec rake gitlab:setup RAILS_ENV=production
!!!注意:
如果你安装最新版可能会报 /home/git/repositories/root 目录找不到,手工建上即可!
如果你看到如下信息:
Administrator account created:
login.........admin@local.host
password......5iveL!fe恭喜你!你已经成功安装GitLab了!别忘了记录输出的管理用户名和密码!
7.启动GitLab
bundle exec rails s -e production
=& Booting WEBrick
=& Rails 3.2.13 application starting in production on http://0.0.0.0:3000
=& Call with -d to detach
=& Ctrl-C to shutdown server
[ 15:04:41] INFO WEBrick 1.3.1
[ 15:04:41] INFO ruby 1.9.3 ()
[x86_64-linux] [ 15:04:41] INFO WEBrick::HTTPServer#start: pid=11488 port=3000
Ok,你现在可以访问GitLab了,默认端口是 @3000@, 访问 http://你的域名或IP:3000
第一访问会比较慢,因为要编译很多js和css.
!!!注意:
3000端口可能受防火墙影响,关闭防火墙 chkconfig iptables off(重启后永久性生效)service
iptables stop(及时生效,重启后失效),或修改/etc/sysconfig/iptables文件
添加 -A RH-Firewall-1-INPUT -m state ——state NEW -m tcp -p tcp ——dport 3000 -j ACCEPT
输入管理用户名和密码!
GitLab安装过程中一些错误可以参照
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:355086次
积分:4250
积分:4250
排名:第5753名
原创:96篇
转载:39篇
评论:31条
(2)(5)(3)(13)(27)(1)(6)(25)(8)(17)(33)1951人阅读
android(213)
已经开始使用Git了,有些时候一般的问题只能Google就能找到答案,但是有些时候不能找到答案,因为遇到的问题都不知道该用什么关键字搜索。很多是在Git中文的QQ群中讨论出来的,把一些经验总结一下:
1.Git子模块
使用情况:例如Android系统代码和app之间可以使用这种submodule的方法来管理。
$ git submodule add url path/to/name&
$ git submodule init
$ git submodule foreach git pull
其它情况下submodule不适用,可以用subtree来代替。
clone代码以及pull时候要这样更新:
git submodule update
2.同步一个COMMIT
$ git cherry-pick xxx
可以同步一个commit到本分支
3.Git打TAG
打TAG也就是发布版本
$ git tag -a v1.2 -m &version 1.4&
$ git push --tags
如果还不能理解可以到这里看看是linus是怎么给linux内核打的TAG,TAG看起来像什么:
4.查看status详情
$ git add xxx
$ git diff --cached
这样可以在commit之前先看一下修改详情。
5.不产生无用的merge的同步
有这么一种情况,用一个分支专门同步代码提供商的代码的时候,如果一般的pull会不断的产生一个merge看起来会很烦,用下边的使用添加一个--rebase就不会产生无用的merge了
$ git pull --rebase origin master
6.关于stash
适用情况:做了修改后,还没有add commit等等后续工作,现在突然要切换分支做其它事情,默认情况下你在这个分支修改的代码会被带到切换过去的分支中。可以先把你修改的保存起来。这些修改可以再还原过来。
$ git stash -u
$ xxxx 随便你的操作
$ git stash pop
注意:-u是代表是也把添加的新文件(术语是未跟踪)也藏起来,一般是要有这个u的。
7.恢复一个COMMIT
如果一个COMMIT你不想要了,想要去除,可以考虑使用以下的方法;
$ git revert xxxx
这个就可以去掉这个COMMIT的改动,这个是明式的去掉,如果你又后悔了,还可以再次恢复。
8.安装最新Git版本
能轻易安装的一般不会是最新的,用apt-get install便是如此。下面用离线的方式安装Git。
$ sudo apt-get install libssl-dev libcurl4-openssl-dev libexpat1-dev
a先到看最新版本,然后复制链接。红色随具体版本变化。
$ apt-get remove git # 卸载现有
$&sudo&apt-get&install&libssl-dev&libcurl4-openssl-dev&libexpat1-dev #安装必要的库
$ wget /git/git/releases/tag/v1.8.4.3&(链接地址)
$ tar xvzf&v1.8.4.3.tar.gz
$ cd git-v1.8.4.3
$ make prefix=/opt/git all
$ make prefix=/opt/git install
$ 添加/opt/git/bin到环境变量中 /etc/environment中,或者其它。
9.安装subtree&
$ git clone&/apenwarr/git-subtree
$ cp git-subtree/git-subtree.sh /opt/git/bin/git-subtree
关于使用的subtree的几个帖子:
10.Git之本地忽略
这个分同种情况:a是本地永久忽略,效果的gitignore一样,只不过不适于写到gitignore中而已,可以自己建立一个本地独享的gitignore,然后git config --global core.excludesfile &文件的绝对路径,也可以直接将本地要忽略的文件添加到.git/info/exclude中。不过上述都是针对没有跟踪的文件来说的,如果文件已经被跟踪了你如果在本地想要忽略它的改动,就不能使用以上的方法了。这正情况b。通俗地讲比如一个编译Android的脚本在其它电脑上都是使用的-j32来编译的,但是你的电脑配置没有别人的好,不能开到-j32,但是这个脚本是已经跟踪过的,你修改了就会在每次的git
status中看到。对于这种情况Git有一个忽略改动的方法:
$ git update-index --assume-unchanged /path/to/file & & & #忽略跟踪
$&git update-index --no-assume-unchanged /path/to/file &#恢复跟踪
之后你在本地修改/path/to/file这个文件,Git也不管它了。就实现了本地忽略。
11.Gitlab用户头像的问题
如果装的Git服务器是GitLab的话,是可以使用用户头像的,GitLab管理头像的一般方法是用gravatar,这一点和github一样,是关联email地址的,先在上边注册一个账户,上传一个头像并关联某一个邮箱,Gitlab或者Github会自动去gravatar上拉取你的个人头像。
12.Git打包源码
对Git管理的源码进行压缩打包,如果使用tar xvzf xxxx.tag.gz xxxxx的话并不是一个很好的选择,因为会将.git/目录下的中间文件全部压缩,如果只想要某一个版本的源码。Git提供了archive.它会给打包一份纯净的代码。当然这个只适用于发部一个版本的源码,而不是备份Git管理的整套源码。
$ git archive xxxx
xxx代表SHA-1 Hash值。
13.Git反向打补丁
一套没有管理有源码,中间有功能A,且也有功能A的补丁文件,可以使用补丁文件进行反打补丁来实现去掉功能A。
$&git apply&-R
注:只是收集,还没有完整测试。
13.关于Git服务器选择和安装
选择建议GitLab,安装我参考加总结这几个帖子:
1.《&》根据国情为官方的安装方法添加了说明的安装文档。
2.《&》一个对安装过程打印信息都记录的安装文档,安装过程中可以对比安装过程。
3.《》中间遇到的问题MySQL密码找不到了,这篇文章给了答案。
14.合并commit
15.Git只clone最新版本代码不要.git目录
这个也是在群中出现了问题,我曾经也有过这样的需求,想法是好的,但是理解是错误的。如果只要最后一个版本的代码,而不要.git目录中的东西,有办法:
git clone --depth=1 git://someserver/somerepo dirformynewrepo
rm -rf !$/.git
但是这又说明不是要参与开发的,是使用的。使用一般是要使用代码开发最新发布版本,如果只要最新的提交版本是没有用处的。因为它不是稳定的。这样就引入了发布版本这一说明,Git中是打Tag,一个tag是一个版本,可以以刚才的需求去找最后一个tag版本。github上是可以直接下载某一个tag版本的。如果要用git clone来完成,会复杂一些。现在的github是结合了web的,例如github或者是自己搭建的gitlab都是可以直接从web上下载指定的tag版本。而没有用于版本控制的.git目录。
16.关于pull和merge
都在提倡添加--no-ff选项。
17.删除子模块-解决子模块自动找上门的问题
& & 也许你并不想要用子模块,但是有时它会自动找上门,那么你要了解一下怎么去除它了。怎么个自动上门,且听我慢慢道来。
& & 在项目A中,如果用git clone了另外一个项目B,或许你只是想把项目B的代码添加到项目A中,但是这时执行git status/add的时候会发现项目B中的代码,并不会被添加,也就是说不能被跟踪。这是为什么呢,这里因为会自动将项目B做为了子模块管理,就是因为它是一个包含.git目录的完整的工程。解决这个问题有同种方法:
1.在clone项目b的后立即将项目B中的.git目录删除
2.git rm --cached path/to/B
然后再执行git status/add 之类的命令就会可以正常的跟踪了。
18.恢复一个文件到之前的某个提交
& & 这个种情况一般是出在某个bug解决后整理规范代码的时候,解决这个bug的时候可能添加了不少的调试代码,最后解决后,有些调试信息只为了了解代码流程,对以后并没有保留的意义,所以就要将其恢复开始解决这个bug之前的提交。xxxxx代表开始解决这个bug之前的一个提交的哈希码。
对于已经跟踪的文件:
1.git reset xxxxxx path/to/file
2.git checkout path/to/file
对于没有跟踪的文件:
1.git rm path/to/file
19.合并时只产生合并提交
& & 还有其它说法:合并时不合并历史;合并时将所有commit合为一个。
git pull --squash another
& & 话说一般用于master分支,像linus的一样。
更多信息见《》《》
20.关于GUI Clients
这里《》。
21.git pull 前简单审查
情况是这样的:本人管理的是develop分支,其他人管理的他们自己的分支。所以应该每次改动的都应该是package/apps下的文件,但是有一种情况是我担心他们会不小心改到系统代码并提交了。在合并之前查看都改了哪些文件。这样就能有效地防止误修改。
和老友沟通后,得出以下结论:
1.让他们添加本地忽略,忽略他们一定不会改的目录。
2.在每次合并代码的时候,看一下每个分支都修改了哪些文件,有没有系统文件被修改。
3.使用grrit。
4.先git fetch 再merge。
最后选择了第二种。因为git pull后,提交的时候会显示出这次合并代码都有哪些修改。
22.Gitk 不错的查看Log的工具
23.Git遇上代码规范
当遇上代码规范会有些事情要处理好,这里写先写个经典的:
1.检测自己要提交的代码中有无
一般多人开发的程序中不准使用代替空格的,以下是()中的截图:
所以在提交代码前自检一下自己代码中有有无table是很有必要的。
$&git&diff&|&grep&-P&“\t”&|&grep&“+”
如果tab已经存在,有很好的解决方案,所以项目代码不要急于commit前期工作很重要。
24.You&are&in&the&middle&of&an&am&session.
$&git&status
On&branch&hardware
You&are&in&the&middle&of&an&am&session.
&&(fix&conflicts&and&then&run&&git&am&--continue&)
&&(use&&git&am&--skip&&to&skip&this&patch)
&&(use&&git&am&--abort&&to&restore&the&original&branch)
nothing&to&commit,&working&directory&clean
对于这个情况,我是在接手一个别人的仓库的时候遇到的,我目前没有更好的方法,也不知道做了哪些事情,我采取的是 重新clone一份代码。
25.Git镜像-简易仓库
&&&&working&tree/bare&tree/remote&tree。
&&&&一般情况下没有这个需求,做镜像一般是中转服务器。
&&&&$&git&clone&--mirror&xxx.git
&&&&执行以上命令将会一个裸版库,正常下来的是代码版本的库。前者不是用来编辑的,它本身是一个服务器上的仓库,可以供客户端进行和。这其实也算是一个简易的服务器了。
在这个裸版库中,没有和,有的只是
$&git&remote&update
会和远程库更新为远程仓库的内容。如果裸版仓库中比远程更新,那么会执行类似的指令强制更新为远程的。所以执行这个命令的时候要小心。因为它会洗掉本地与远端不同的内容「」。在也没有什么类似的功能。
26.获取远程tags.
git fetch --tags
27.添加空目录
&&&&$&find . -type d -empty -exec touch {}/.gitignore \;
&&&&执行以上命令将会
28.新建立android系统源码仓库时要加--force选项以强制添加已经被忽略的文件
gitignore 新建立android系统源码仓库注意事项
第一次添加文件是一定要加上--force选项 添加所有文件(包括被忽略的文件),因为子目录中会有.gitignore忽略一些对Android系统很必要的文件。如会忽略config.h,但这个文件很重要。没有它就编译不过。也有可能是dbus子项目的.gitignore写错了,也有可能是故意忽略。
总之强制添加config.h后就不会再被删除。
说Android只是一个例子,大的项目都需要考虑一下。
关于config.h为什么会被忽略,前边加有说明 对Android很必要,因为Android编译和普通linux系统上编译库的方法不一样。android不是通过./configure自动生成config.h。Android系统是要一个已经好的config.h通过Android.mk的方式进行编译。
29.&get_tz_offset& is not exported by the Git module
执行git cvsimport -v test_project时出现的错误,升级为最新版本2.2.1没有问题了。
30.Git打包解包
免不了要做这些事情,直接将项目所在目录打包是最直观的,但是对于超级大的项目来说会很占空间。
而事实上只需要.git目录就可以将所有源码进行还原,以下是打包解包过程。
tar cvzf xxx.tar.gz .git
tar xvf xxx.tar.gz
mv xxx .git
git fsck --full #该命令的作用是从.git还原为最新源码
版权声明:本文为博主原创文章,未经博主允许不得转载。
& & & & &已经开始使用Git了,有些时候一般的问题只能Google就能找到答案,但是有些时候不能找到答案,因为遇到的问题都不知道该用什么关键字搜索。很多是在Git中文的QQ群中讨论出来的,把一些经验总结一下:
1.Git子模块
使用情况:例如Android系统代码和app之间可以使用这种submodule的方法来管理。
$ git submodule add url path/to/name&
$ git submodule init
$ git submodule foreach git pull
其它情况下submodule不适用,可以用subtree来代替。
clone代码以及pull时候要这样更新:
git submodule update
2.同步一个COMMIT
$ git cherry-pick xxx
可以同步一个commit到本分支
3.Git打TAG
打TAG也就是发布版本
$ git tag -a v1.2 -m &version 1.4&
$ git push --tags
如果还不能理解可以到这里看看是linus是怎么给linux内核打的TAG,TAG看起来像什么:
4.查看status详情
$ git add xxx
$ git diff --cached
这样可以在commit之前先看一下修改详情。
5.不产生无用的merge的同步
有这么一种情况,用一个分支专门同步代码提供商的代码的时候,如果一般的pull会不断的产生一个merge看起来会很烦,用下边的使用添加一个--rebase就不会产生无用的merge了
$ git pull --rebase origin master
6.关于stash
适用情况:做了修改后,还没有add commit等等后续工作,现在突然要切换分支做其它事情,默认情况下你在这个分支修改的代码会被带到切换过去的分支中。可以先把你修改的保存起来。这些修改可以再还原过来。
$ git stash -u
$ xxxx 随便你的操作
$ git stash pop
注意:-u是代表是也把添加的新文件(术语是未跟踪)也藏起来,一般是要有这个u的。
7.恢复一个COMMIT
如果一个COMMIT你不想要了,想要去除,可以考虑使用以下的方法;
$ git revert xxxx
这个就可以去掉这个COMMIT的改动,这个是明式的去掉,如果你又后悔了,还可以再次恢复。
8.安装最新Git版本
能轻易安装的一般不会是最新的,用apt-get install便是如此。下面用离线的方式安装Git。
$ sudo apt-get install libssl-dev libcurl4-openssl-dev libexpat1-dev
a先到看最新版本,然后复制链接。红色随具体版本变化。
$ apt-get remove git # 卸载现有
$&sudo&apt-get&install&libssl-dev&libcurl4-openssl-dev&libexpat1-dev #安装必要的库
$ wget /git/git/releases/tag/v1.8.4.3&(链接地址)
$ tar xvzf&v1.8.4.3.tar.gz
$ cd git-v1.8.4.3
$ make prefix=/opt/git all
$ make prefix=/opt/git install
$ 添加/opt/git/bin到环境变量中 /etc/environment中,或者其它。
9.安装subtree&
$ git clone&/apenwarr/git-subtree
$ cp git-subtree/git-subtree.sh /opt/git/bin/git-subtree
关于使用的subtree的几个帖子:
10.Git之本地忽略
这个分同种情况:a是本地永久忽略,效果的gitignore一样,只不过不适于写到gitignore中而已,可以自己建立一个本地独享的gitignore,然后git config --global core.excludesfile &文件的绝对路径,也可以直接将本地要忽略的文件添加到.git/info/exclude中。不过上述都是针对没有跟踪的文件来说的,如果文件已经被跟踪了你如果在本地想要忽略它的改动,就不能使用以上的方法了。这正情况b。通俗地讲比如一个编译Android的脚本在其它电脑上都是使用的-j32来编译的,但是你的电脑配置没有别人的好,不能开到-j32,但是这个脚本是已经跟踪过的,你修改了就会在每次的git
status中看到。对于这种情况Git有一个忽略改动的方法:
$ git update-index --assume-unchanged /path/to/file & & & #忽略跟踪
$&git update-index --no-assume-unchanged /path/to/file &#恢复跟踪
之后你在本地修改/path/to/file这个文件,Git也不管它了。就实现了本地忽略。
11.Gitlab用户头像的问题
如果装的Git服务器是GitLab的话,是可以使用用户头像的,GitLab管理头像的一般方法是用gravatar,这一点和github一样,是关联email地址的,先在上边注册一个账户,上传一个头像并关联某一个邮箱,Gitlab或者Github会自动去gravatar上拉取你的个人头像。
12.Git打包源码
对Git管理的源码进行压缩打包,如果使用tar xvzf xxxx.tag.gz xxxxx的话并不是一个很好的选择,因为会将.git/目录下的中间文件全部压缩,如果只想要某一个版本的源码。Git提供了archive.它会给打包一份纯净的代码。当然这个只适用于发部一个版本的源码,而不是备份Git管理的整套源码。
$ git archive xxxx
xxx代表SHA-1 Hash值。
13.Git反向打补丁
一套没有管理有源码,中间有功能A,且也有功能A的补丁文件,可以使用补丁文件进行反打补丁来实现去掉功能A。
$&git apply&-R
注:只是收集,还没有完整测试。
13.关于Git服务器选择和安装
选择建议GitLab,安装我参考加总结这几个帖子:
1.《&》根据国情为官方的安装方法添加了说明的安装文档。
2.《&》一个对安装过程打印信息都记录的安装文档,安装过程中可以对比安装过程。
3.《》中间遇到的问题MySQL密码找不到了,这篇文章给了答案。
14.合并commit
15.Git只clone最新版本代码不要.git目录
这个也是在群中出现了问题,我曾经也有过这样的需求,想法是好的,但是理解是错误的。如果只要最后一个版本的代码,而不要.git目录中的东西,有办法:
git clone --depth=1 git://someserver/somerepo dirformynewrepo
rm -rf !$/.git
但是这又说明不是要参与开发的,是使用的。使用一般是要使用代码开发最新发布版本,如果只要最新的提交版本是没有用处的。因为它不是稳定的。这样就引入了发布版本这一说明,Git中是打Tag,一个tag是一个版本,可以以刚才的需求去找最后一个tag版本。github上是可以直接下载某一个tag版本的。如果要用git clone来完成,会复杂一些。现在的github是结合了web的,例如github或者是自己搭建的gitlab都是可以直接从web上下载指定的tag版本。而没有用于版本控制的.git目录。
16.关于pull和merge
都在提倡添加--no-ff选项。
17.删除子模块-解决子模块自动找上门的问题
& & 也许你并不想要用子模块,但是有时它会自动找上门,那么你要了解一下怎么去除它了。怎么个自动上门,且听我慢慢道来。
& & 在项目A中,如果用git clone了另外一个项目B,或许你只是想把项目B的代码添加到项目A中,但是这时执行git status/add的时候会发现项目B中的代码,并不会被添加,也就是说不能被跟踪。这是为什么呢,这里因为会自动将项目B做为了子模块管理,就是因为它是一个包含.git目录的完整的工程。解决这个问题有同种方法:
1.在clone项目b的后立即将项目B中的.git目录删除
2.git rm --cached path/to/B
然后再执行git status/add 之类的命令就会可以正常的跟踪了。
18.恢复一个文件到之前的某个提交
& & 这个种情况一般是出在某个bug解决后整理规范代码的时候,解决这个bug的时候可能添加了不少的调试代码,最后解决后,有些调试信息只为了了解代码流程,对以后并没有保留的意义,所以就要将其恢复开始解决这个bug之前的提交。xxxxx代表开始解决这个bug之前的一个提交的哈希码。
对于已经跟踪的文件:
1.git reset xxxxxx path/to/file
2.git checkout path/to/file
对于没有跟踪的文件:
1.git rm path/to/file
19.合并时只产生合并提交
& & 还有其它说法:合并时不合并历史;合并时将所有commit合为一个。
git pull --squash another
& & 话说一般用于master分支,像linus的一样。
更多信息见《》《》
20.关于GUI Clients
这里《》。
21.git pull 前简单审查
情况是这样的:本人管理的是develop分支,其他人管理的他们自己的分支。所以应该每次改动的都应该是package/apps下的文件,但是有一种情况是我担心他们会不小心改到系统代码并提交了。在合并之前查看都改了哪些文件。这样就能有效地防止误修改。
和老友沟通后,得出以下结论:
1.让他们添加本地忽略,忽略他们一定不会改的目录。
2.在每次合并代码的时候,看一下每个分支都修改了哪些文件,有没有系统文件被修改。
3.使用grrit。
4.先git fetch 再merge。
最后选择了第二种。因为git pull后,提交的时候会显示出这次合并代码都有哪些修改。
22.Gitk 不错的查看Log的工具
23.Git遇上代码规范
当遇上代码规范会有些事情要处理好,这里写先写个经典的:
1.检测自己要提交的代码中有无
一般多人开发的程序中不准使用代替空格的,以下是()中的截图:
所以在提交代码前自检一下自己代码中有有无table是很有必要的。
$&git&diff&|&grep&-P&“\t”&|&grep&“+”
如果tab已经存在,有很好的解决方案,所以项目代码不要急于commit前期工作很重要。
24.You&are&in&the&middle&of&an&am&session.
$&git&status
On&branch&hardware
You&are&in&the&middle&of&an&am&session.
&&(fix&conflicts&and&then&run&&git&am&--continue&)
&&(use&&git&am&--skip&&to&skip&this&patch)
&&(use&&git&am&--abort&&to&restore&the&original&branch)
nothing&to&commit,&working&directory&clean
对于这个情况,我是在接手一个别人的仓库的时候遇到的,我目前没有更好的方法,也不知道做了哪些事情,我采取的是 重新clone一份代码。
25.Git镜像-简易仓库
&&&&working&tree/bare&tree/remote&tree。
&&&&一般情况下没有这个需求,做镜像一般是中转服务器。
&&&&$&git&clone&--mirror&xxx.git
&&&&执行以上命令将会一个裸版库,正常下来的是代码版本的库。前者不是用来编辑的,它本身是一个服务器上的仓库,可以供客户端进行和。这其实也算是一个简易的服务器了。
在这个裸版库中,没有和,有的只是
$&git&remote&update
会和远程库更新为远程仓库的内容。如果裸版仓库中比远程更新,那么会执行类似的指令强制更新为远程的。所以执行这个命令的时候要小心。因为它会洗掉本地与远端不同的内容「」。在也没有什么类似的功能。
26.获取远程tags.
git fetch --tags
27.添加空目录
&&&&$&find . -type d -empty -exec touch {}/.gitignore \;
&&&&执行以上命令将会
28.新建立android系统源码仓库时要加--force选项以强制添加已经被忽略的文件
gitignore 新建立android系统源码仓库注意事项
第一次添加文件是一定要加上--force选项 添加所有文件(包括被忽略的文件),因为子目录中会有.gitignore忽略一些对Android系统很必要的文件。如会忽略config.h,但这个文件很重要。没有它就编译不过。也有可能是dbus子项目的.gitignore写错了,也有可能是故意忽略。
总之强制添加config.h后就不会再被删除。
说Android只是一个例子,大的项目都需要考虑一下。
关于config.h为什么会被忽略,前边加有说明 对Android很必要,因为Android编译和普通linux系统上编译库的方法不一样。android不是通过./configure自动生成config.h。Android系统是要一个已经好的config.h通过Android.mk的方式进行编译。
29.&get_tz_offset& is not exported by the Git module
执行git cvsimport -v test_project时出现的错误,升级为最新版本2.2.1没有问题了。
30.Git打包解包
免不了要做这些事情,直接将项目所在目录打包是最直观的,但是对于超级大的项目来说会很占空间。
而事实上只需要.git目录就可以将所有源码进行还原,以下是打包解包过程。
tar cvzf xxx.tar.gz .git
tar xvf xxx.tar.gz
mv xxx .git
git fsck --full #该命令的作用是从.git还原为最新源码
版权声明:本文为博主原创文章,未经博主允许不得转载。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:226967次
积分:3687
积分:3687
排名:第7037名
原创:111篇
转载:161篇
评论:69条
(2)(10)(3)(2)(3)(11)(15)(5)(1)(2)(7)(3)(5)(2)(3)(2)(1)(1)(1)(4)(5)(6)(6)(1)(1)(10)(2)(10)(6)(9)(7)(6)(11)(13)(10)(4)(8)(25)(17)(9)(8)(1)(6)(11)

我要回帖

更多关于 oject class swift 的文章

 

随机推荐