分类 git articles

从git中永久删除文件

有时候历史提交添加过比较大的文件或者敏感文件, 后面也删掉了, 可是git历史记录里面还有, 也会占用空间.
这时候就要用下面的方法来永久删除了.

  1. 运行底层命令git verify-pack以识别出大对象, 对输出的第三列信息即文件大小进行排序
$git verify-pack -v .git/objects/pack/pack-6d6...b0b.idx -v | sort -n -k 3 | tail -5
034...2c4 blob   8943 3472 21832
ec2...08b blob   11117 3081 29005
270...9e8 blob   12687 4841 14122
d57...91a blob   17888 5654 41757
829...3e7 blob   25644 5743 65787

或者直接看全部idx文件

……

Continue reading

Repo 常用命令

repo介绍

Android 使用 Git 作为代码管理工具, 开发了 Gerrit 进行代码审核以便更好的对代码进行集中式管理, 
还开发了 Repo 命令行工具,对 Git 部分命令封装,将百多个 Git 库有效的进行组织.

源代码标记和细分版本

https://source.android.google.cn/setup/start/build-numbers#source-code-tags-and-builds

使用国内源

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
export REPO_URL='https://gerrit-googlesource.proxy.ustclug.org/git-repo'

建立本地镜像

repo init -u git://mirrors.ustc.edu.cn/aosp/mirror/manifest --mirror
repo sync
/usr/bin/git daemon --verbose --export-all --base-path=/mnt /mnt/mirror-aosp

初始化repo

repo init -u git://127.0.0.1/mirror-aosp/platform/manifest
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-8.0.0_r1

下载代码

repo sync

查看全部版本

cd .repo/manifests
git branch --all

查看分支

repo branch

创建并切换分支

repo init -b android-8.0.0_r23
repo start --all android-8.0.0_r23

切换分支

对 git checkout 的封装,但不能带-b参数,所以不能用此命令来创建特性分支
repo checkout android-8.0.0_r23

查看工作区文件差异

git diff 的封装,用于分别显示各个项目工作区下的文件差异
repo diff                                 ---查看所有项目
repo diff platform/build platform/bionic  ---只查看其中两个项目

把文件添加到index表中

对 git add --interactive 的封装, 用于挑选各个项目工作区中的改动以加入暂存区
repo stage -i [<project>…]
    -i 代表 git add --interactive 命令中的 --interactive, 给出个界面供用户选择

删除已经合并分支

对 git branch –d 的封装,该命令用于扫面项目的各个分支,并删除已经合并的分支
repo prune [<project>…]

删除指定分支

对git branch –D 的封装
repo abandon <branchname> [<project>…]

查看文件状态

repo status
对 git diff-index, git diff-filse 的封装, 同时显示暂存区的状态和本地文件修改的状态
每个小节的首行显示羡慕名称,以及所在分支的名称,

第一个字母表示暂存区的文件修改状态
    -:没有改变
    A:添加(不在HEAD中,在暂存区中)
    M:修改(在HEAD中,在暂存区中,内容不同)
    D:删除(在HEAD中,不在暂存区)
    R:重命名(不在HEAD中,在暂存区,路径修改)
    C:拷贝(不在HEAD中,在暂存区,从其他文件拷贝)
    T:文件状态改变(在HEAD中,在暂存区,内容相同)
    U:未合并,需要冲突解决

第二个字母表示工作区文件的更改状态
    -:新/未知(不在暂存区,在工作区)
    m:修改(在暂存区,在工作区,被修改)
    d:删除(在暂存区,不在工作区)

两个表示状态的字母后面,显示文件名信息。如果有文件重名还会显示改变前后的文件名及文件的相似度

设置远程仓库

这个指令是根据xml文件添加的远程分支, 方便于向服务器提交代码, 执行之后的build目录下看到新的远程分支org
repo remote add <remotename>  <url> [<project>…]
repo remote rm <remotename>  [<project>…]

向服务器提交代码

repo push <remotename> [--all |<project>…]
repo会自己查询需要向服务器提交的项目并提示用户.

repo forall

repo forall [<project>…] –c <command>
迭代器,可以在所有指定的项目中执行同一个shell指令
Options:
    -c:后面所带的参数着是shell指令
    -p:在shell指令输出之前列出项目名称
    -v:列出执行shell指令输出的错误信息

additional environment variables:
    REPO_PROJECT:指定项目的名称
    REPO_PATH:指定项目在工作区的相对路径
    REPO_REMOTE:指定项目远程仓库的名称
    REPO_LREV:指定项目最后一次提交服务器仓库对应的哈希值
    REPO_RREV:指定项目在克隆时的指定分支,manifest里的revision属性

如果-c后面所带的shell指令中有上述环境变量,则需要用单引号把shell指令括起来.
    repo forall –c 'echo $REPO_PROJECT'

清除所有修改及更新命令

repo forall -c "pwd;git clean -f;git checkout -f";repo sync -c --no-tags;repo sync -l;

merge(合并多个分支)

把所有项目多切换到master分支,执行以下指令将topic分支合并到master分支
repo forall –p –c git merge topic

tag(打标签)

在所有项目下打标签
repo forall –c git tag crane-stable-1.6

remote (设置远程仓库)

引用环境变量REPO_PROJECT添加远程仓库:
repo forall –c ‘git remote add korg ssh://[email protected]/$REPO_PROJECT.git’

删除远程仓库:

repo forall –c git remote add korg

branch(创建特性分支)

repo forall –c git branch crane-dev
repo forall –c git checkout –b crane-dev

repo的额外命令集

repo grep

对 git grep 的封装,用于在项目文件中进行内容查找

显示manifest文件内容

repo manifest –o android.xml

显示repo的版本号

repo version

repo upload

repo upload相当于git push,但是又有很大的不同,它不是将版本库改动推送到克隆时的远程服务器,
而是推送到代码审核服务器(Gerrit软件架设)的特殊引用上,使用SSH协议.
代码审核服务器会对推送的提交进行特殊处理,将新的提交显示为一个待审核的修改集,并进入代码审查流程,
只有当审核通过后,才会合并到官方正式的版本库中.

repo upload [--re --cc] {[<project>]… | --replace <project>}
 Options:
    -h, --help:显示帮助信息
    -t:发送本地分支名称到Gerrit代码审核服务器
    --replace:发送此分支的更新补丁集
    --re=REVIEWERS:要求指定的人员进行审核
    --cc=CC:同时发送通知到如下邮件地址

repo download

主要用于代码审核者下载和评估贡献者提交的修订
repo download {project change [patchset]}…

repo selfupdate

用于repo自身的更新

参考:

……

Continue reading