Experience Git - chaolunner/CloudNotes GitHub Wiki

如何在Unity里使用Git

  • 添加Unity专用的.gitignore
  • 打开编辑器设置窗口通过 Edit > Project Settings > Editor
    • 使.meta文件可见,以避免损坏引用对象 Version Control / Mode: “Visible Meta Files“
    • 使用纯文本序列化可以避免无法解决的合并冲突 Asset Serialization / Mode: “Force Text”
    • 你也可以通过直接修改ProjectSettings/EditorSettings.asset文件来达到一样的效果
      m_ExternalVersionControlSupport: Visible Meta Files
      m_SerializationMode: 2
      
  • 启用Git Large File Storage通过添加.gitattributes

常用命令

# 删除当前目录下没有被track过的文件和文件夹
git clean -df

# 还原当前目录下被track过的文件
git reset --hard

# 将当前目录下所有变化的文件,放入暂存区
$ git add .

# 将指定目录下所有变化的文件,放入暂存区
$ git add <directory>

# 合并某个分支上的单个commit到当前分支
git cherry-pick 62ecb3

# 刷新远程仓库分支列表
git remote update origin -p

# 生成 SSH 公钥
ssh-keygen -t rsa -b 4096 -C"<添加注释>"

缓存凭证

git config --global credential.helper manager

删除历史记录

# 克隆Repository
git clone <repo-name>.git

# 移除.git文件目录
rm -rf .git

# 仅使用最新内容重建本地仓库
git init
git add .
git commit -m "Initial commit"

# 推到Remote
git remote add origin <repo-name>.git
git push -u --force origin master

Git LFS 相关的错误

  • 错误1:[404] Object does not exist on the server

    解决方法1:通过命令行上传指定文件git lfs push --object-id origin f8efcb92cf226f3cd236f7aa4a31e5cda7cd94a89bcece6241dbfc97986fe5e4

    解决方法2:通过命令行上传全部文件git lfs push --all origin master

  • 错误2:Encountered 2 file(s) that should have been pointers, but weren’t

    直接修改 .gitattributes,导致已在储存库中的文件没有正确的 Git LFS 连结

    解决方法(这里以 .fbs 文件为例):

    • 先删掉 .gitattributes,让 Git LFS 不要跟踪任何文件

    • 接着用 git lfs track 指令,来设定 Git LFS 要管理的文件

      这个指令的好处是它会把储存库中符合的文件也修改成 Git LFS 所需的格式,而直接修改 .gitattributes 就没有这个好处

    • 设定好后,应该会有一堆文件变成已修改 (modified),这时就可以用 git commit 指令提交修改了

    git rm .gitattributes
    git lfs track "*.fbs"
    git commit -m "Re-track *.fbs in git lfs"
    
  • 安装Git LFS v2.2.1 (or later)

  • 重写例如当前分支上所有Remote上不存在的*.mp4视频文件:

    git lfs migrate import --include="*.mp4"
    
  • 或者,重写给定分支上的所有*.mp4视频文件,而不管它们是否存在于Remote(可能需要force-push):

    git lfs migrate import --include="*.mp4" --include-ref=refs/heads/master --include-ref=refs/heads/my-feature
    
  • 将转换后的Repository作为新Repository推送:

    git push --force
    
  • 迁移后清理.git目录

    上面的代码成功地将先前存在的git对象转换为lfs对象。 但是,常规对象仍保留在.git目录中。 这些将最终由git清除,但是要立即清除它们,请运行:

    git reflog expire --expire-unreachable=now --all
    git gc --prune=now
    

使用BFG迁移现有的Repository数据到LFS

  • 克隆Repository

    git clone --mirror [email protected]:<username>/<repo-name>.git
    

    通过添加镜像标签可以得到一个包含所有分支的.git文件夹

  • 备份克隆下来的.git文件夹,以防之后出现错误可以还原回这个版本

  • Fetch LFS

    cd <repo-name>.git
    git lfs fetch --all
    

    理论上上一步的镜像克隆已经取得了LFS,但似乎这个并没有支持的很完美,出于安全的考虑还是在执行一次该操作

  • 使用BFG转换Git历史记录

    确保你已经下载了最新的BFG版本

    调用如下指令:

    java -jar <path to>bfg-x.x.x.jar --convert-to-git-lfs "*.{png,mp4}" --no-blob-protection
    

    是你下载的bfg-x.x.x.jar的绝对路径,本示例中只转换png和mp4两种类型的文件

    这将重写所有分支的所有历史记录,并用LFS版本替换所有png或mp4文件

    这里再提供一个完整版本的指令:

    java -jar <path to>bfg-x.x.x.jar --convert-to-git-lfs "*.{cubemap,unitypackage,apk,exe,ipa,pdf,dll,pdb,so,7z,bz2,gz,rar,tar,zip,3dm,3ds,blend,c4d,collada,dae,dxf,fbx,jas,lws,lxo,ma,max,mb,obj,ply,skp,stl,ztl,abc,aif,aiff,it,mod,mp3,ogg,s3m,wav,xm,otf,ttf,bmp,exr,gif,hdr,iff,jpeg,jpg,pict,png,psd,tga,tif,tiff,ai,asd,pmp,asf,avi,flv,mov,mp4,mpeg,mpg,ogv,wmv,a,arobject,lxo,reason,rns}" --no-blob-protection
    
  • Prune LFS

    git reflog expire --expire = now --all && git gc --prune = now
    

    BFG重写历史记录,将文件提取到lfs或objects,并添加.gitattributes进行LFS跟踪

  • 初始化Git LFS

    git lfs install
    

    这会将pre-push hook添加到Repository中

  • 将转换后的Repository推回Remote

    git push --force --all
    

    这会将所有大文件推送到LFS存储,然后用新的历史记录覆盖原来的历史记录

  • 在操作中你可能遇到如下问题:

⚠️ **GitHub.com Fallback** ⚠️