1. 个人gitconfig
1# cat ~/.gitconfig
2
3[color]
4 ui = auto
5
6[safe]
7# directory = *
8
9[core]
10# 支持中文
11 quotepath = false
12 editor = vim
13#
14 pager = less -x1,5
15# 支持https下保存用户名密码
16[credential]
17 helper = store
1git config --global core.quotepath false
3. 使用git grep快速搜索
1git grep -Inw xxx
2git grep -Inw -p xxx
3git grep -Inw --heading xxx
5. 取消git clone –depth=1
1git pull --unshadow
4. git统计每个人的代码量
1git log --format='%aN' | sort -u \
2 | while read name; do \
3 echo -en "${name}\t"; \
4 git log --author="${name}" --pretty=tformat: --numstat \
5 | awk '{add += $1; subs += $2; loc += $1 - $2 } END {printf "add lines: %s, total lines: %s\n", add, subs, loc }' -; \
6 done
6. 解决warning: refname ‘private’ is ambiguous
6.1. 现象
1$ git checkout private
2warning: refname 'private' is ambiguous.
3Switched to branch 'private'
4Your branch is up to date with 'private/private'.
5
6$ git branch -a
7 main
8* private
9 remotes/origin/main
10 remotes/private/HEAD -> private/private
11 remotes/private/private
6.2. 解决方法
1$ find .git -name HEAD
2.git/logs/refs/remotes/private/HEAD
3.git/logs/HEAD
4.git/refs/remotes/private/HEAD
5.git/HEAD
6
7find .git -name HEAD | grep -w private | xargs rm -f
6.3. 处理后的现象
1$ git checkout private
2Switched to branch 'private'
3Your branch is up to date with 'private/private'.
7. 合并git仓库并保留commit记录
参考【Git教程】如何清除git仓库的所有提交记录,成为一个新的干净仓库
从网上查到的使用git merge的方式不能满足需求。就改成了将一个仓库的历史记录生成patch,再在另一个仓库中使用git am应用patch来实现合并仓库。
仓库目录结构如下,需要将repoBBB中的提交记录合并到repoAAA中,之后就可以删除repoBBB了。
1.
2├── patch
3├── repoAAA
4└── repoBBB
7.1. 没有同名文件
两个参考下没有同名文件(包括.gitignore等以.开头的文件),或同名文件已经移动或重命名,并commit。
需要注意,repoAAA中不能存在任何repoBBB历史中曾出现过的文件,否则会导致patch应用失败。
1rm -f patch/*
2cd repoAAA
3# 把$BRANCH分支所有commit都生成patch
4git format-patch --root -o ../patch $BRANCH
5
6
7cd repoBBB
8# 防止之前有未完成的操作
9git am --abort
10# 应用所有patch
11git am ../patch/*
12git push
7.2. 存在同名文件
需要首先将同名文件用新仓库中的文件覆盖。
需要注意,repoAAA中不能存在任何repoBBB历史中曾出现过的文件,否则会导致patch应用失败。
1rm -f patch/*
2cd repoAAA
3
4first_commit=$(git rev-list --max-parents=0 HEAD)
5# first_commit=$(git log --reverse | head -1 | cut -d ' ' -f 2)
6
7# 除第一次提交之外,其他的commit都生成patch
8git format-patch -o ../patch ${first_commit}
9# 回退到第一次commit时的状态,为了后续覆盖repoBBB中的同名文件使用
10git reset --hard ${first_commit}
11
12
13cd repoBBB
14cp -fr ../repoAAA/* ./
15# 使用repoBBB中的文件覆盖当前目录的同名文件
16cp -fr ../repoAAA/.* ./
17git add .
18# 这次commit是为了保证repoAAA中的文件与repoBBB的${first_commit}一致,以便后续应用patch
19git commit -m "message"
20
21git am --abort
22git am ../patch/*
23git push