今天遇到了一个问题。之前随手写了一个自动部署的脚本,今天报错了。写出来和大家分享一下。
这个自动化脚本是读取git仓库的项目,然后选择一个分支的代码进行编译测试打包部署。结果在读取git分支这一步出错了,我直接读取仓库的refs/heads目录文件。之前这个目录下有多个文件,每个文件代表一个分支。可是今天这个目录文件下面没有了,那分支都去哪里了,难道分支被删了?不管怎样,至少有一个分支吧,我心里默想到。事实摆在眼前,我们还是先解决问题吧。
最后改成用命令git show-ref --heads
获取分支,自动部署脚本正常了。
看来还需要好好研究一下git。
git会不定期的运行auto gc
的命令,这个命令一般是不做任何处理,只有当git仓库有很多松散的对象(不在packfile中的对象)、很多packfile时才会执行git gc
命令。此命令会做很多工作:收集所有松散对象并将它们存入 packfile,合并这些 packfile 进一个大的 packfile,然后将不被任何 commit 引用并且已存在一段时间 (数月) 的对象删除。
手动执行git gc
,执行完毕后可以发现,不光refs/heads
里面文件被清空了,整个refs目录中的文件都被清空了。Git 会将这些文件挪到 .git/packed-refs
文件中去以提高效率。
当更新一个引用时,Git 不会修改这个文件,而是在 refs/heads 下写入一个新文件。当查找一个引用的 SHA 时,Git 首先在 refs 目录下查找,如果未找到则到 packed-refs 文件中去查找。因此如果在 refs 目录下找不到一个引用,该引用可能存到 packed-refs 文件中去了。