[TOC]

Github 上传超过100M的大文件

官方示例:

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 使其对文件名大小写敏感

git config core.ignorecase false

本地大小写敏感,但是远端并不是,会造成远端有大写和小定的2个文件,详见:

git 撤销本地所有未提交的更改

git checkout .

后面有.点,表示全部文件撤销

git 撤销本地已提交(commit),或已推送远端(push)的更改

如果你只想为之前的commit增加更多的改动,或者改变之前的提交信息,你应该使用:

git reset --soft HEAD~

会将你的改动保留在暂存区内(只是改变了HEAD的指向,本地代码不会变化)。或使用

git reset HEAD~

回退上一次提交前,并且强制清除修改的内容:

git reset --hard HEAD^

如果已经提交到远程,就需要用本地覆盖远程,通过:

git push origin master --force

强制提交当前版本号,以达到撤销版本号的目的。必须添加参数force进行强制提交,否则会提交失败,并报错(原因:本地项目版本号低于远端仓库版本号。)。

一步提交git变更

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}

Git仓库完整迁移(含历史记录log)

1). 从原地址克隆一份裸版本库。

git clone --bare git://github.com/username/project.git

2). 然后到新的 Git 服务器上创建一个新项目。

3). 以镜像推送的方式上传代码到新的 Git 服务器上。

cd project.git

git push --mirror git@gitcafe.com/username/newproject.git

4). 删除本地代码

cd ..

rm -rf project.git

5). 到新服务器上找到 Clone 地址,直接 Clone 到本地就可以了。

git clone git@gitcafe.com/username/newproject.git

这种方式可以保留原版本库中的所有内容。

第二种切换remote_url的方法更直接,直接更改.git/conf配置文件里的ip地址就行。但是需要一个一个分支push。

Sourcetree 更新git账号密码

删除Sourcetree 缓存文件(只需要删密码文件),文件位置:

Mac: 
~/Library/Application Support/SourceTree 

Windows: 
C:\Users\USERNAME\AppData\Local\Atlassian\SourceTree

删除对应账号的文件后,重启Sourcetree,然后push或者pull代码的时候,就会自动弹框让重新输入账号和密码

git flow

  • 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
    
  • git-flow 备忘清单

  • git-flow 的工作流程

Alpha、Beta、RC、GA 版本的区别

  • 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,代表专业版。

α、β、λ常用来表示软件测试过程中的三个阶段,α是第一阶段,一般只供内部测试使用;β是第二个阶段,已经消除了软件中大部分的不完善之处,但仍有可能还存在缺陷和漏洞,一般只提供给特定的用户群来测试使用;λ是第三个阶段,此时产品已经相当成熟,只需在个别地方再做进一步的优化处理即可上市发行。

git cherry-pick 使用

选择某一个分支中的一个或几个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>

Adding an SSH key to your GitLab account

  • Generate ssh key use RSA:
    ssh-keygen -o -t rsa -b 4096 -C "email@example.com"
    

注:此命令会提示您输入存储密钥的位置和文件名。只需按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 拉取代码时,报错: ```sh 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生成等,可以直接清空内容或者删除文件即可。


```sh
➜ git clone git@172.16.1.88: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接受即可,以后再连接也不会出现确认提示了。

.gitignore 规则

#               表示此为注释,将被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子模块

  • 添加子模块

    $ git submodule add https://github.com/ihtcboy/submodule.git submodule
    
  • 查看子模块

    $ git submodule (status)
    
  • 更新项目内子模块到最新版本

    $ git submodule update
    
  • 更新子模块为远程项目的最新版本

    $ git submodule update --remote
    
  • 克隆包含子模块的项目 ```shell //初始化子模块 $ git submodule init

//更新子模块 $ git submodule update


* 递归克隆整个项目
* 
```git
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

fork后如何同步源的新更新内容?

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 只获取部分目录或文件的内容(稀疏检出)

$ 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 push 时出现错误:“remote: fatal: early EOF”

修改 .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 是压缩速度与最终获得文件大小的不同程度的权衡,数字越大,压缩越慢,当然得到的文件会越小。

git错误:fatal: The remote end hung up unexpectedly

fatal: The remote end hung up unexpectedly

提交多文件或大文件导致http postbuffer溢出,将postbuffer改大就可以了

git config http.postBuffer 524288000

Git --force & --force-with-lease

  • --force : 使用本地分支的提交覆盖远端推送分支的提交。也就是说,如果其他人在相同的分支推送了新的提交,你的这一举动将“删除”他的那些提交!就算在强制推送之前先 fetch 并且 mergerebase 了也是不安全的,因为这些操作到推送之间依然存在时间差,别人的提交可能发生在这个时间差之内。

Travis CI

在项目的根目录中创建一个名为 .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 文件作为值。

Copyright © iHTCboy.com 2020-11-08 11:51:19 更新

results matching ""

    No results matching ""