[TOC]
官方示例:
Homebrew: brew install git-lfs
git lfs install
git lfs track "*.psd"
git add .gitattributes
There is no step three. Just commit and push to GitHub as you normally would.
使用示例:
git add file.psd
git commit -m "Add design file"
git push origin master
注:.gitattributes
文件是 git lfs用于记录那些文件要通过lfs上传的配置文件。
另:
This repository is over its data quota. Purchase more data packs to restore access.
意思就是"仓库超出限额,需要配置更多的额度",这个可以在自己GitHub个人设置里查看,默认只有1G的空间,更多空间需要按月收费。。。
配置 Git 使其对文件名大小写敏感
git config core.ignorecase false
本地大小写敏感,但是远端并不是,会造成远端有大写和小定的2个文件,详见:
git checkout .
后面有.点,表示全部文件撤销
如果你只想为之前的commit增加更多的改动,或者改变之前的提交信息,你应该使用:
git reset --soft HEAD~
会将你的改动保留在暂存区内(只是改变了HEAD的指向,本地代码不会变化)。或使用
git reset HEAD~
回退上一次提交前,并且强制清除修改的内容:
git reset --hard HEAD^
如果已经提交到远程,就需要用本地覆盖远程,通过:
git push origin master --force
强制提交当前版本号,以达到撤销版本号的目的。必须添加参数force进行强制提交,否则会提交失败,并报错(原因:本地项目版本号低于远端仓库版本号。)。
function lazygit() {
git add .
git commit -a -m "$1"
git push
}
1). 从原地址克隆一份裸版本库。
git clone --bare git://github.com/username/project.git
2). 然后到新的 Git 服务器上创建一个新项目。
3). 以镜像推送的方式上传代码到新的 Git 服务器上。
cd project.git
git push --mirror [email protected]/username/newproject.git
4). 删除本地代码
cd ..
rm -rf project.git
5). 到新服务器上找到 Clone 地址,直接 Clone 到本地就可以了。
git clone [email protected]/username/newproject.git
这种方式可以保留原版本库中的所有内容。
第二种切换remote_url的方法更直接,直接更改.git/conf配置文件里的ip地址就行。但是需要一个一个分支push。
删除Sourcetree 缓存文件(只需要删密码文件),文件位置:
Mac:
~/Library/Application Support/SourceTree
Windows:
C:\Users\USERNAME\AppData\Local\Atlassian\SourceTree
删除对应账号的文件后,重启Sourcetree,然后push或者pull代码的时候,就会自动弹框让重新输入账号和密码
- install
macOS: brew install git-flow-avh
linux: apt-get install git-flow
- init
git flow init
- feature
git flow feature help
git flow feature start xxx
git flow feature finish xxx
git flow feature publish xxx
git flow feature pull origin xxx
- releases
git flow release start 1.1.5
git flow release finish 1.1.5
git flow release publish 1.1.5
git flow release pull origin 1.1.5
- hotfix
git flow hotfix start xxx
git flow hotfix finish xxx
-
Alpha:Alpha是内部测试版,一般不向外部发布,会有很多Bug,一般只有测试人员使用。除非你也是测试人员,否则不建议使用。alpha 是希腊字母的第一位,表示最初级的版本,alpha 就是
α
,beta 就是β
,alpha 版就是比 beta 还早的测试版,一般都是内部测试的版本。 -
Beta:也是测试版,这个阶段的版本会一直加入新的功能。在Alpha版之后推出,该版本相对于
α
版已有了很大的改进,消除了严重的错误,但还是存在着一些缺陷,需要经过多次测试来进一步修复。 -
RC:
Release Candidate
顾名思义!Candidate
是候选人的意思,用在软件上就是候选版本。RC 就是发行候选版本。和Beta版最大的差别在于,Beta阶段会一直加入新的功能,但是到了RC版本,几乎就不会加入新的功能了,而主要着重于除错!RC版本是最终发放给用户的最接近正式版的版本,发行后改正bug就是正式版了,就是正式版之前的最后一个测试版。 -
GA:
General Availability
(一般可用性)正式发布的版本,在国外都是用GA来说明release 版本的。比如:Apache Struts 2 GA
就是 Apache Struts 2 首次发行稳定的版本,也就是官方开始推荐广泛使用的版本。 -
Release: 该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本。该版本有时也称为标准版。一般情况下,Release不会以单词形式出现在软件封面上,取而代之的是符号(R)。
-
RTM:
Release to Manufacture
是给工厂大量压片的版本,内容跟正式版是一样的,不过 RTM 版也有出限制、评估版的。但是和正式版本的主要程序代码都是一样的。 -
OEM:是给计算机厂商随着计算机贩卖的,也就是随机版。只能随机器出货,不能零售。只能全新安装,不能从旧有操作系统升级。包装不像零售版精美,通常只有一面CD和说明书(授权书)。
-
RVL:号称是正式版,其实RVL根本不是版本的名称。它是中文版/英文版文档破解出来的。
-
EVAL:而流通在网络上的EVAL版,与“评估版”类似,功能上和零售版没有区别。
-
RTL:
Retail
(零售版) 是真正的正式版,正式上架零售版。在安装盘的i386文件夹里有一个eula.txt,最后有一行EULAID,就是你的版本。比如简体中文正式版是EULAID:WX.4_PRO_RTL_CN,繁体中文正式版是WX.4_PRO_RTL_TW。其中:如果是WX.开头是正式版,WB.开头是测试版。_PRE,代表家庭版;_PRO,代表专业版。
α、β、λ常用来表示软件测试过程中的三个阶段,α是第一阶段,一般只供内部测试使用;β是第二个阶段,已经消除了软件中大部分的不完善之处,但仍有可能还存在缺陷和漏洞,一般只提供给特定的用户群来测试使用;λ是第三个阶段,此时产品已经相当成熟,只需在个别地方再做进一步的优化处理即可上市发行。
选择某一个分支中的一个或几个commit(s)来进行操作。
git cherry-pick <commit id>:单独合并一个提交
git cherry-pick -x <commit id>:同上,不同点:保留原提交者信息。
Git从1.7.2版本开始支持批量cherry-pick,就是一次可以cherry-pick一个区间的commit。
git cherry-pick <start-commit-id>..<end-commit-id>
git cherry-pick <start-commit-id>^..<end-commit-id>
- Generate ssh key use RSA:
ssh-keygen -o -t rsa -b 4096 -C "[email protected]"
注:此命令会提示您输入存储密钥的位置和文件名。只需按enter使用默认值就可以。
成功后:
The key's randomart image is:
+---[RSA 4096]----+
| .o+ |
|. +.o |
| + = . |
|o + * |
|+. + o .S |
|.+ o o.o |
| * *.oo . |
| o %oO .o |
|..*+%*E= |
+----[SHA256]-----+
- Copy ssh public key macOS:
pbcopy < ~/.ssh/id_rsa.pub
WSL / GNU/Linux (requires the xclip package):
xclip -sel clip < ~/.ssh/id_rsa.pub
Git Bash on Windows:
cat ~/.ssh/id_rsa.pub | clip
- Q&A 拉取代码时,报错:
Cloning into 'htcproject'...
/Users/iHTCboy/.ssh/config line 4: garbage at end of line; "Enterprise".
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
原因是 config
中包含非法的字符,可能是之前配置或者多个账号配置,Sourcetree生成等,可以直接清空内容或者删除文件即可。
➜ git clone [email protected]:ios/iHTCboy/ftproject.git
Cloning into 'ftproject'...
The authenticity of host '172.16.1.88 (172.16.1.88)' can't be established.
RSA key fingerprint is SHA256:aRCcbTE77qYN9jWV9vns6BG1yUs.
Are you sure you want to continue connecting (yes/no)?
在第一次使用 SSH 连接 GitLab 的时候会有一个RSA密码指纹确认,输入yes接受即可,以后再连接也不会出现确认提示了。
# 表示此为注释,将被Git忽略
*.a 表示忽略所有 .a 结尾的文件
!lib.a 表示但lib.a除外
/TODO 表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ 表示忽略 build/目录下的所有文件,过滤整个build文件夹;
doc/*.txt 表示会忽略doc/notes.txt但不包括 doc/server/arch.txt
bin/: 表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
/bin: 表示忽略根目录下的bin文件
/*.c: 表示忽略cat.c,不忽略 build/cat.c
debug/*.obj: 表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj
**/foo: 表示忽略/foo,a/foo,a/b/foo等
a/**/b: 表示忽略a/b, a/x/b,a/x/y/b等
!/bin/run.sh 表示不忽略bin目录下的run.sh文件
*.log: 表示忽略所有 .log 文件
config.php: 表示忽略当前路径的 config.php 文件
/mtk/ 表示过滤整个文件夹
*.zip 表示过滤所有.zip文件
/mtk/do.c 表示过滤某个具体文件
被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。
需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中,如下:
!*.zip
!/mtk/one.txt
唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。为什么要有两种规则呢?
想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么.gitignore规则应写为::
/mtk/*
!/mtk/one.txt
假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!
注意上面的/mtk/*不能写为/mtk/,否则父目录被前面的规则排除掉了,one.txt文件虽然加了!过滤规则,也不会生效!
----------------------------------------------------------------------------------
还有一些规则如下:
fd1/*
说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;
/fd1/*
说明:忽略根目录下的 /fd1/ 目录的全部内容;
/*
!.gitignore
!/fw/
/fw/*
!/fw/bin/
!/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;注意要先对bin/的父目录使用!规则,使其不被排除。
- 添加子模块
$ git submodule add https://github.com/ihtcboy/submodule.git submodule
- 查看子模块
$ git submodule (status)
- 更新项目内子模块到最新版本
$ git submodule update
- 更新子模块为远程项目的最新版本
$ git submodule update --remote
- 克隆包含子模块的项目
//初始化子模块
$ git submodule init
//更新子模块
$ git submodule update
- 递归克隆整个项目
git clone https://github.com/ihtcboy/submodule.git submodule --recursive
- 删除子模块
删除子模块文件夹:
$ git rm --cached submodule
$ rm -rf submodule
删除.gitmodules文件中相关子模块信息:
[submodule "submodule"]
path = submodule
url = https://github.com/ihtcboy/submodule.git
删除.git/config中的相关子模块信息:
[submodule "submodule"]:
url = https://github.com/ihtcboy/submodule.git
删除.git文件夹中的相关子模块文件:
$ rm -rf .git/modules/submodule
1.首先将别人的仓库添加到你的上游远程,通常命名为upstream(这个名字可以随意改,不要使用 `origin`).
```git
git remote add upstream url(表示原作者仓库)
2.用 git remote -v
可以看到一个origin是自己的,另外一个upstream原作者。
3.更新代码:
git fetch upstream //去拉去原作者的仓库更新
git checkout master //切换到自己的master
git merge upstream/master //merge或者rebase到你的master
$ git init <project>
$ cd <project>
$ git remote add origin ssh://<user>@<repository's url>
$ git config core.sparsecheckout true
$ echo "path1/" >> .git/info/sparse-checkout
$ echo "path2/" >> .git/info/sparse-checkout
$ git pull origin master
- sparse-checkout 文件设置
- 子目录的匹配:如果目录名称前带斜杠,如/docs/,将只匹配项目根目录下的docs目录,如果目录名称前不带斜杠,如docs/,其他目录下如果也有这个名称的目录,如test/docs/也能被匹配。而如果写了多级目录,如docs/01/,则不管前面是否带有斜杠,都只匹配项目根目录下的目录,如test/docs/01/不能被匹配。
- 通配符 ““ (星号),在 sparse-checkout 文件中,支持通配符 ““
- 排除项 “!” (感叹号)在 sparse-checkout 文件中,也支持排除项 “!”
- 增加或删除 sparse-checkout 配置
$ git checkout master
或执行以下命令:
$ git read-tree -mu HEAD
注:如果想关闭 sparse checkout,需要用一个”*“号替代其中的内容,然后执行 checkout 或 read-tree 命令。
修改 .git 的本地 config
文件,在 core
中加入:
compression = -1
或者直接执行:
git config --add core.compression -1
core.compression
An integer -1..9, indicating a default compression level. -1 is the zlib default. 0 means no compression, and 1..9 are various speed/size tradeoffs, 9 being slowest. If set, this provides a default to other compression variables, such as core.loosecompression and pack.compression. - From Git Manpage
compression
是压缩的意思,从 clone 的终端输出就知道,服务器会压缩目标文件,然后传输到客户端,客户端再解压。取值为 [-1, 9],-1 以 zlib 为默认压缩库,0 表示不进行压缩,1..9 是压缩速度与最终获得文件大小的不同程度的权衡,数字越大,压缩越慢,当然得到的文件会越小。
fatal: The remote end hung up unexpectedly
提交多文件或大文件导致http postbuffer
溢出,将postbuffer
改大就可以了
git config http.postBuffer 524288000
-
--force
: 使用本地分支的提交覆盖远端推送分支的提交。也就是说,如果其他人在相同的分支推送了新的提交,你的这一举动将“删除”他的那些提交!就算在强制推送之前先fetch
并且merge
或rebase
了也是不安全的,因为这些操作到推送之间依然存在时间差,别人的提交可能发生在这个时间差之内。 -
--force-with-lease
: 如果远端有其他人推送了新的提交,那么推送将被拒绝,这种拒绝和没有加 --force 参数时的拒绝是一样的。
现象: 克隆项目时,如果项目很大,可能会出现错误:
error: RPC failed; curl 56 Recv failure: Operation timed out
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
原因: http缓存不够或者网络不稳定等。
解决方法:
- 查看当前配置命令
git config -l
- httpBuffer 缓冲区加大
git config --global http.postBuffer 524288000
git config --global https.postBuffer 524288000
- 设置压缩
git config --global core.compression -1
Updates were rejected because the tag already exists in the remote.
解决:
git pull --tags
覆盖本地存在的标签冲突:
git pull --tags -f
在项目的根目录中创建一个名为 .travis.yml 的文件:
language: objective-c
osx_image: xcode12.2
xcode_xcworkspace: iWuBi.xcworkspace
xcode_scheme: iWuBi
xcode_sdk: iphonesimulator14.0
podfile: Podfile
-
Objective-c 或 Swift 项目,都是指定 objective-c 值,因为 Travis 也只使用 Xcode 命令行工具 xcodebuild 进行构建。
-
如果项目是 .xcodeproj 使用 xcode_project 来指定 Xcode 项目文件;如果使用 .xcworkspace 构建项目(CocoaPods 的项目),则需要将 xcode_project 参数替换为 xcode_workspace 并使用 .xcworkspace 文件作为值。