标签归档:git

Git 永久移除文件

Git 基于内容寻址的文件系统及数据对象1等设计,默认情况下,文件每次变更都生成一个副本。如果需要移除已经 push 到远程仓库中的文件,那么仅当前 commit 删除 ignore 并不能完全地移除掉对应的文件,还需要把其从所有的历史记录中移除才行。

这个需求可以通过 git filter-branch 来完成,但这个命令偏底层,具体到删除文件这个场景上,可以使用 bfg-repo-cleaner 这个工具。这个工具功能挺多的,具体参考官网文档或使用时的提示。

下面是一个删除指定目录的流程

git clone --mirror xxRepo   # 需要在 mirror 模式下操作
cd xxRepo
java -jar path/to/bfg.jar --delete-folders "{build, dist}" --no-blob-protection
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push

参考

git pull 与 rebase

最初使用独立的工具 git-up,后来 git 支持了同样的功能,通过配置 git config --global alias.up 'pull --rebase --autostash 即可达到同样的效果。

如果希望在 pull 的时候直接使用 rebase 机制,可以像下面这样配置

git config --global pull.rebase true
git config --global rebase.autoStash true

git pull 效果

git pull 效果

git pull —rebase 效果

git pull --rebase 效果

Git checkout 指定分支

直接 clone 时就 clone 指定分支而不是默认的 master

git clone -b branch_name repo

先 clone 下来,再 checkout 到指定分支

git co -b branch_name origin/branch_name

Git 文件名大小写问题

由于 Mac 下文件名大小写不敏感,造成 git 下如果改了名字,譬如小写改大些,推送到 linux 服务器的时候会没有效果,Github 上的也是小写。
所以,如果在 Mac 上改文件名,需要用下面的命令

$ git mv --force myfile MyFile