Git 配置

发布于 更新于

AI总结: 本文介绍了Git数据传输的基本流程,包括工作空间、数据缓存区、本地仓库和远程仓库的关系。具体操作包括添加、提交、推送、拉取和检索等。文中详细描述了.git/config文件的各项配置,如仓库格式版本、文件权限跟踪、裸仓库设置、日志记录等,以及用户信息和远程仓库的配置。此外,还提到.gitattributes文件的用途,包括换行符处理、文件类型识别和合并策略。最后,介绍了通过includeIf指令进行多仓库目录环境配置的方式,以实现智能切换不同的Git配置。文本中没有明显的错误观点。

git数据传输

workspace       index          local repository      remote repository
-------------commit -a---------------->|
--------add------>|--------commit----->|
                                        -------push-------->|
<------------------------pull-------------------------------|
                                       |<------fetch--------|
<--------------checkout head-----------|
<-----checkout----|
<-----------------diff head------------|
<------diff-------|
workspace            用户的工作空间 
index                数据缓存区 
local repository     本地仓库 
remote repository    远程仓库

.git/config

[core]
    # repositoryformatversion 指定 Git 仓库的版本,默认值为 0,通常不需要修改
    repositoryformatversion = 0  

    # filemode 表示是否跟踪文件的权限变化
    # true: 跟踪权限变化(适用于 Linux/macOS)
    # false: 忽略权限变化(适用于 Windows)
    filemode = false  

    # bare 表示是否为裸仓库(无工作区,仅存储 Git 数据)
    # true: 裸仓库,适用于远程仓库
    # false: 非裸仓库,适用于本地开发
    bare = false  

    # logallrefupdates 表示是否记录所有引用的更新(如分支、标签等的变化)
    # true: 启用,便于日志追踪
    # false: 禁用
    logallrefupdates = true  

    # ignorecase 指定是否忽略文件名的大小写差异
    # true: 忽略大小写(适用于 Windows/Mac)
    # false: 区分大小写(适用于 Linux)
    ignorecase = false  

    # autocrlf 指定是否在换行符转换上启用自动化处理
    # true: 提交时将 CRLF 转换为 LF,检出时将 LF 转换为 CRLF(适用于 Windows)
    # input: 提交时将 CRLF 转换为 LF,检出时不做转换(适用于 Linux/Mac)
    # false: 不进行任何换行符转换
    autocrlf = false  

[remote "origin"]
    # url 是远程仓库的地址,支持 HTTP(S)、SSH 等协议
    url = https://github.com/xxx/xxx.git  

    # fetch 定义从远程仓库抓取分支的规则
    # +refs/heads/main:refs/remotes/origin/main 表示同步远程主分支到本地
    fetch = +refs/heads/main:refs/remotes/origin/main  

[branch "main"]
    # remote 指定当前分支关联的远程仓库
    remote = origin  

    # merge 指定当前分支与远程仓库的哪个分支进行合并
    merge = refs/heads/main  

    # vscode-merge-base 是 Visual Studio Code 的扩展字段,用于记录分支合并基线
    vscode-merge-base = origin/main  

[user]
    # name 是用户的 Git 提交签名用户名
    name = random  

    # email 是用户的 Git 提交签名邮箱地址
    email = r@n.dom  

# 比较工具
[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = \"D:/WinMerge/WinMergeU.exe\" \"$LOCAL\" \"$REMOTE\"
[merge]
    tool = diffmerge
[mergetool]
    keepbackup = false
[mergetool "diffmerge"]
    cmd = \"D:/WinMerge/WinMergeU.exe\" \"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"
    trustexitcode = true

.gitattritubes

# 设置文本文件的换行符处理规则
# text: 指定文件为文本文件,Git 将自动处理换行符
# eol=lf: 仓库中保存 LF(适用于 Linux/Mac)
# eol=crlf: 仓库中保存 CRLF(适用于 Windows)
# auto: 根据系统自动设置换行符
* text eol=lf

# 为 Markdown 文件强制指定为文本文件,使用 LF 换行符
*.md text eol=lf

# 为批处理脚本文件强制指定为文本文件,使用 CRLF 换行符
*.bat text eol=crlf

# 忽略二进制文件的自动换行符处理
# binary: 指定文件为二进制文件,Git 不会进行任何换行符转换
*.png binary
*.jpg binary
*.zip binary

# 禁用合并策略的处理,防止合并冲突对某些文件类型生效
# merge=ours: 在合并时使用“我们”的版本,忽略对方的更改
*.lock merge=ours

# 为 JSON 文件指定自定义差异工具
# diff=custom_json: 使用自定义工具处理 JSON 文件的差异
*.json diff=custom_json

# 配置大文件的存储,使用 Git LFS
# filter=lfs: 启用 Git LFS(大文件存储)过滤器
*.psd filter=lfs
*.mp4 filter=lfs

# 指定文件在合并时自动接受所有更改
# merge=union: 合并时自动保留双方的更改
*.txt merge=union

多仓库目录环境配置

采用 includeIf 指令实现智能切换:

# ~/.gitconfig 主配置文件
[includeIf "gitdir:D:/work/"]
    path = .gitconfig-work  # 工作账号配置

[includeIf "gitdir:D:/personal/"]
    path = .gitconfig-personal  # 私人账号配置

[includeIf "onbranch:main"]
    path = .gitconfig-personal

[includeIf "hasconfig:remote.*.url:https://github.com/**"]
    path = .gitconfig-personal 
# ~/.gitconfig-work 工作专用配置
[user]
    name = 公司开发者
    email = work@company.com
    signingkey = WORK-SIGN-KEY

[core]
    autocrlf = input
# ~/.gitconfig-personal 私人配置
[user]
    name = 个人开发者
    email = me@domain.com
[github]
    token = xxxx-xxxx-xxxx-xxxx