gitignore 不起作用的解决办法
gitignore 不起作用的解决办法 - sloong - 博客园 https://www.cnblogs.com/sloong/p/5523244.html
Administrator@PC-2016 MINGW64 /d/Data-Structure (master)
$ git rm -r --cached .
rm '.gitignore'
rm '01 绪论/Status.h'
rm '02 线性表/01 SequenceList/H.h'
rm '02 线性表/02 Union/H.h'
rm '02 线性表/03 MergeSqList/H.h'
rm '02 线性表/04 SinglyLinkedList/H.h'
rm 'Data-Structure.dev'
rm 'Data-Structure.exe'
rm 'Data-Structure.layout'
rm 'Makefile.win'
rm 'README.md'
rm 'learnC/Pointers.c'
rm 'learnC/Pointers.exe'
rm 'learnC/switch.c'
rm 'main.c'
rm 'main.o' Administrator@PC-2016 MINGW64 /d/Data-Structure (master)
$ git add . Administrator@PC-2016 MINGW64 /d/Data-Structure (master)
$ git commit -m "update .gitignore:git rm -r --cached ."
[master e2e61ef] update .gitignore:git rm -r --cached .
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 main.o Administrator@PC-2016 MINGW64 /d/Data-Structure (master)
$ git push origin master
Username for 'https://github.com': toywei
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/toywei/Data-Structure.git/' Administrator@PC-2016 MINGW64 /d/Data-Structure (master)
$ git push origin master
Username for 'https://github.com': toywei
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 232 bytes | 232.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/toywei/Data-Structure.git
8f666d3..e2e61ef master -> master Administrator@PC-2016 MINGW64 /d/Data-Structure (master)
$
git忽略已经被提交的文件 - SegmentFault 思否 https://segmentfault.com/q/1010000000430426
tl;dr: 正确的做法应该是:git rm --cached logs/xx.log
,然后更新 .gitignore
忽略掉目标文件,最后 git commit -m "We really don't want Git to track this anymore!"
具体的原因如下:
被采纳的答案虽然能达到(暂时的)目的,但并非最正确的做法,这样做是误解了 git update-index
的含义,而且这样做带来的最直接(不良)后果是这样的:
所有的团队成员都必须对目标文件执行:
git update-index --assume-unchanged <PATH>
。这是因为即使你让 Git 假装看不见目标文件的改变,但文件本身还是在 Git 的历史记录里的,所以团队的每个人在 fetch 的时候都会拉到目标文件的变更。(但实际上目标文件是根本不想被 Git 记录的,而不是假装看不见它发生了改变)一旦有人改变目标文件之后没有
git update-index --assume-unchanged <PATH>
就直接 push 了,那么接下来所有拉取了最新代码的成员必须重新执行 update-index,否则 Git 又会开始记录目标文件的变化。这一点实际上很常见的,比如说某成员换了机器或者硬盘,重新 clone 了一份代码库,由于目标文件还在 Git 的历史记录里,所以他/她很可能会忘记 update-index。
为什么会这样?答案就在 Git 的 man pages 里:
首先,git update-index 的定义是:
Register file contents in the working tree to the index(把工作区下的文件内容注册到索引区)
这句话暗含的意思是:update-index 针对的是 Git 数据库里被记录的文件,而不是那些需要忽略的文件。
接着看关于 --assume-unchanged 的几句相关的描述:
When the "assume unchanged" bit is on, Git stops checking the working tree files for possible modifications, so you need to manually unset the bit to tell Git when you change the working tree file. This is sometimes helpful when working with a big project on a filesystem that has very slow lstat(2) system call (e.g. cifs).
大致意思是:
应用了该标识之后,Git 停止查看工作区文件可能发生的改变,所以你必须 手动 重置该标识以便 Git 知道你想要恢复对文件改变的追踪。当你工作在一个大型项目中,这在文件系统的
lstat
系统调用非常迟钝的时候会很有用。
我们知道 Git 不仅仅是用来做代码版本管理的,很多其他领域的项目也会使用 Git。比如说我公司曾经一个客户的项目涉及到精密零件图纸文档的版本管理,他们也用 Git。有一种使用场景是对一些体积庞大的文件进行修改,但是每一次保存 Git 都要计算文件的变化并更新工作区,这在硬盘慢的时候延迟卡顿非常明显。
git update-index --assume-unchanged
的真正用法是这样的:
- 你正在修改一个巨大的文件,你先对其
git update-index --assume-unchanged
,这样 Git 暂时不会理睬你对文件做的修改; - 当你的工作告一段落决定可以提交的时候,重置改标识:
git update-index --no-assume-unchanged
,于是 Git 只需要做一次更新,这是完全可以接受的了; - 提交+推送。
另外,根据文档的进一步描述:
This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked files (akin to what .gitignore does for untracked files).
这段描述告诉我们两个事实:
- 虽然可以用其来达成楼主想要的结果,但这是不讲究的做法(coarse);
- 同样的事情更应该用
.gitignore
文件来实现(针对未追踪的文件)。
随之而来的问题是:为什么我增加了 .gitignore 里的规则却没有效果?
这是因为我们误解了 .gitignore 文件的用途,该文件只能作用于 Untracked Files,也就是那些从来没有被 Git 记录过的文件(自添加以后,从未 add 及 commit 过的文件)。
之所以你的规则不生效,是因为那些 .log
文件曾经被 Git 记录过,因此 .gitignore
对它们完全无效。这也正是开头那段简短答案所做的事情:
- 从 Git 的数据库中删除对于该文件的追踪;
- 把对应的规则写入 .gitignore,让忽略真正生效;
- 提交+推送。
只有这样做,所有的团队成员才会保持一致而不会有后遗症,也只有这样做,其他的团队成员根本不需要做额外的工作来维持对一个文件的改变忽略。
最后有一点需要注意的,git rm --cached
删除的是追踪状态,而不是物理文件;如果你真的是彻底不想要了,你也可以直接 rm
+忽略+提交。
gitignore 不起作用的解决办法的更多相关文章
- gitignore 不起作用的解决办法 不再跟踪 让.gitignore生效,跟踪希望被跟踪的文件
实践 # https://git-scm.com/docs/gitignore https://git-scm.com/docs/gitignore 不跟踪log目录下的所有文件,但需要保留这个文件夹 ...
- Git .gitignore 不起作用的解决办法
解决方法的原理:.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的. 解决方案:git rm -r --cached . ...
- Git忽略规则及.gitignore规则不生效的解决办法
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件).这个文件每一行保存了一个匹配的规则例如: # 此为注 ...
- .gitignore规则不生效的解决办法
.gitignore规则不生效的解决办法 使用git 的时候,在.gitignore中已经添加了某个文件或者文件夹,但是使用git status还能看见该文件的修改提示--–说明.gitignore未 ...
- Git忽略规则和.gitignore规则不生效的解决办法
Git忽略规则和.gitignore规则不生效的解决办法 Git忽略规则: 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如果 ...
- 【转载】Git忽略规则和.gitignore规则不生效的解决办法
原文:https://www.cnblogs.com/zhangxiaoliu/p/6008038.html Git忽略规则: 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 ...
- ng-disabled 不起作用的解决办法
不知道这算不算 Angular.js 的一个bug.但搜索一番后找到了一个变通的解决办法. 业务需求是这样的, 按钮被点击一次之后就设置为禁用状态, 以阻止多次无效的点击.但现在很多框架都用 < ...
- ios8 UITableView设置 setSeparatorInset:UIEdgeInsetsZero不起作用的解决办法
在ios7中,UITableViewCell左侧会有默认15像素的空白.这时候,设置setSeparatorInset:UIEdgeInsetsZero 能将空白去掉. 但是在ios8中,设置setS ...
- ios8 UITableView设置 setSeparatorInset:UIEdgeInsetsZero不起作用的解决办法(去掉15px空白间距)
但是在ios8中,设置setSeparatorInset:UIEdgeInsetsZero 已经不起作用了.下面是解决办法: 首先在viewDidLoad方法加入以下代码: if(leftTable! ...
随机推荐
- 升级python(linux)
查看系统当前python版本 2: [root@wangyuelou ~]# python Python 2.4.3 (#1, May 5 2011, 16:39:10) [GCC ...
- 【iCore4 双核心板_FPGA】例程六:触发器实验——触发器的使用
实验现象: 按下按键,绿色led亮灭交互: //--------------------module_rst_n---------------------------// module trigger ...
- Linux查看文件总的数据行数,并按行拆分
先利用 wc -l BLM.txt 读出 BLM.txt 文件一共有多少行. 再 1. 以行数拆分 -l 参数: split –l 50 原始文件 拆分后文件名前缀 例:以50行对文件进行 ...
- hive表增量抽取到mysql(关系数据库)的通用程序(三)
hive表增量抽取到oracle数据库的通用程序(一) hive表增量抽取到oracle数据库的通用程序(二) 这几天又用到了该功能了,所以又改进了一版,增加了全量抽取和批量抽取两个参数.并且可以设置 ...
- openCV函数
1.cvInitFont ,, ); font 被初始化的字体结构体. font_face 字体名称标识符.只是Hershey 字体集( http://sources.isc.org/utils/mi ...
- 关于CLOS架构的举例 网络级 设备级 FATTREE网络 网络级CLOS 以及CLOS涉及的调度算法RR
1.概述 CLOS来自于传统电路交换概念,这个概念年代太久远,在当前数据通信网络中,内涵有所变化.本文主要谈的是实际上赋予的与原来略微有所差异的内涵. CLOS架构本身概念比较宽泛,有设备级的CLOS ...
- windows下添加多个git仓库账号
当使用git方式下载时,如果没有配置过ssh key,会提示错误(git clone支持https和git(即ssh)两种方式下载源码) 当需要在机器上使用不同的git账户,这就需要知道如何在机器上添 ...
- [Bayes] Point --> Line: Estimate "π" by R
“半个数学系 + 一个计算机科学系 = Deep Learning初级班” simulation = function(sampleSize){ c = rep(0,sampleSize) // &l ...
- java面试(2)--大数据相关
第一部分.十道海量数据处理面试题 1.海量日志数据,提取出某日访问百度次数最多的那个IP. 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中.注意到IP是32位的,最多有个2^ ...
- 关于 oh-my-zsh 插件的使用(以 Sublime Text 为例)
这里不讲 oh-my-zsh 是什么.也不讲 oh-my-zsh 插件的工作原理(太深奥,不懂 ). 讲一讲作为一个初学者,在使用过程中遇到的问题以及解决方法. 1 缘起 Ubuntu下,编辑/预览 ...