前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Git忽略本地的文件修改,保留其在远程仓库的状态.md

Git忽略本地的文件修改,保留其在远程仓库的状态.md

作者头像
vincentKo
发布于 2022-09-19 06:53:11
发布于 2022-09-19 06:53:11
1.9K10
代码可运行
举报
文章被收录于专栏:VK | BLOGVK | BLOG
运行总次数:0
代码可运行

Git忽略本地的文件修改,保留其在远程仓库的状态

项目中的一些配置文件,需要在本地根据实际情况配置和修改,但同时这些配置仅在本地使用,并不想提交到远程仓库,这个时候仅使用.gitignore就办不到了...

如引言中的使用场景,在项目中有一些配置文件在远程仓库存在,但是本地的修改并不具有普适性,因此是不需要提交到远程仓库的,天真的我一开始将项目拉下后,直接在.gitingnore中添加了相关文件,但是在修改后发现,根本不会生效

失效的.gitignore

查了下.gitignore不生效的问题,发现如下解释:

The files/folder in your version control will not just delete themselves just because you added them to the .gitignore. They are already in the repository and you have to remove them.

即文件已经被track后,再添加到.gitignore是无效的,因为git不会自动的帮你删除文件,这一步需要手动去做,即:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git rm -rf --cached .
git add .

这个操作是删除仓库中的所有文件,然后再将他们添加回来,注意添加进仓库的时候,track的规则就会根据最新的.gitignore进行。

好家伙,这肯定不行啊,因为这个操作是直接把配置文件给干掉了,即远程仓库也不再会有这个文件,这显然不是我想要的效果。因此,开始寻找新的方案

探寻方案

我们的核心诉求并不是'ingnore'文件,删除以及不上传这些文件,而是Only keep it in the remote repo

但是在我的知识体系中,还没有一个很好的解决方式,遂google探索之,终于找到了非常符合场景需求的一个git操作:

  • 忽略跟踪
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git update-index --assume-unchanged <file>
  • 查看被忽略的跟踪文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git ls-files -v | grep '^h '
  • 恢复忽略文件,重新被版本控制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git update-index --no-assume-unchanged <file>
  • git update-index只能忽略单个文件,想要忽略整个文件夹下的文件,可以使用以下命令:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd dir
git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

方案优化

以上指令的确可以满足一开始的诉求,但是正开开心心搞完,切花分支时,一个checkout竟然失败了,提示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 error: Your local changes to the following files would be overwritten by merge ...

但是查看git tree并没有任何跟踪文件是没有保存和提交的状态,也就是说之前被设置忽略的文件,犹如掩耳盗铃般,只是不被提交,但是在mergecheckout的时候还是会被提示覆盖风险而导致git操作失败。

所以最终选择使用了--skip-worktree指令, 与之前的方案非常类似:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 原指令
git update-index --no-assume-unchanged -- <file>

# 优化指令
git update-index --skip-worktree -- <file>

至于和原指令的差别,可以查看这篇文章Difference Between 'assume-unchanged' and 'skip-worktree'

最终方案

  • 忽略文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git update-index --skip-worktree --  <file>
  • 查看忽略的文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git ls-files -v | grep -i ^S
  • 取消标志,恢复版本控制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git update-index --no-skip-worktree -- <file>
  • 批量忽略文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd dir
git update-index --skip-worktree $(git ls-files | tr '\n' ' ')

参考

  1. git update-index --assume-unchanged on directory
  2. 忽略不想提交的文件
  3. using gitignore to ignore (but not delete) files
  4. Git: untrack a file in local repo only and keep it in the remote repo
  5. git pull error for git update-index --assume-unchanged files
  6. git忽略本地文件
  7. Git命令git update-index --assume-unchanged,忽略不想提交的文件(忽略跟踪)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
我用的更新后的,切换分支的时候还是会提示:Please commit your changes or stash them before you switch branches.切不了呀
我用的更新后的,切换分支的时候还是会提示:Please commit your changes or stash them before you switch branches.切不了呀
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
git设置忽略同步的文件或文件夹
针对git同步,可以进行灵活的设定。git官方提供了四种方式来忽略文件同步,针对不同的场景灵活应用。
一梦三千里
2022/09/26
3.5K0
git取消文件或文件夹追踪
1. 创建仓库时,在本地仓库根目录,创建.gitignore文件,写入忽略规则。规则可以是文件名,或者正则表达式。git 对于 .gitignore配置文件是按行从上到下进行规则匹配的。对于.gitignore文件本身的修改也会被提交到远程端。
超级小可爱
2023/02/22
1.9K0
Git中忽略文件提交、取消文件追踪的方式(多中方式)
使用Git进行版本管理多人协作开发,常会遇到我们本地可能存在一套自己的配置或者某些测试文件不需要提交到远端的情况。因此需要使用Git的相关命令进行文件排除或解除追踪。
超级小可爱
2023/02/23
2.8K0
忽略不想提交的文件- 每天三分钟玩转Git(10)大结局
第二种:git远程仓库里有这些文件,比如配置,我们必须要在本地修改配置来适应当前运行环境,难说还会涉及到数据库连接密码等敏感信息,这种情况下我们不想每次提交的时候都去跟踪这些文件,也不想把本地的记录提交上去。
机智的程序员小熊
2019/12/12
1.6K0
忽略不想提交的文件- 每天三分钟玩转Git(10)大结局
Git忽略已经提交过一次文件Git忽略文件
1、从未提交过的文件可以用.gitignore 也就是添加之后从来没有提交(commit)过的文件,可以使用.gitignore忽略该文件
超级小可爱
2023/02/23
6200
git忽略文件追踪
git忽略追踪文件包括两种,一种是未提交到git仓库的文件,一种是已经提交到git仓库中的文件。
党志强
2020/01/23
2K0
git忽略本地已存在文件的修改[通俗易懂]
git仓库提交总有一些文件不想提交到远程,而git忽略的文件也有但是不能动 因为.gitignore 文件的东西变得话 会提交到仓库 我本地一些config的配置我不想每次提交都把勾去掉 所以git设置 忽略仅仅我本地的一些文件的上传
全栈程序员站长
2022/07/19
5.5K0
git提交如何忽略某些文件
在使用git对项目进行版本管理的时候,我们总有一些不需要提交到版本库里的文件和文件夹,这个时候我们就需要让git自动忽略掉一下文件。 使用.gitignore忽略文件 为了让git忽略指定的文件和文件
用户1741436
2018/05/16
15.4K0
Git忽略已经提交过一次文件Git忽略文件
也就是添加之后从来没有提交(commit)过的文件,可以使用.gitignore忽略该文件
iOSDevLog
2020/07/03
2.5K0
git,程序配置文件管理,忽略本地更改
所以我们应该这样子做:git仓库提供一份配置文件的基础模板,每个人都拉取到本地修改但是要忽略本地更改监听。
宣言言言
2019/12/15
1.1K0
常用的Git Tips
一、Configuration:配置 列举所有的别名与配置 git config --list Git 别名配置 git config --global alias. git config --global alias.st status 设置git为大小写敏感 git config --global core.ignorecase false 二、Help:常用的辅助查询命令 在git 命令行里查看everyday git git help everyday 显示git常用的帮助命令 git help -g 获取Git Bash的自动补全 ~/.git-completion.bash && echo '[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash' >> ~/.bashrc 设置自动更正 git config --global help.autocorrect 1 三、Remote:远端仓库配置 获取所有远端引用配置 git remote 或者 git remote show 修改某个远端的地址 git remote set-url origin URL Repo 查看当前仓库中的所有未打包的objects和磁盘占用 git count-objects --human-readable 从object数据库中删除所有不可达的object git gc --prune=now --aggressive 四、文件类操作 ,Cache:缓存,Track:文件追踪, 展示所有被追踪的文件 git ls-files -t 展示所有未被追踪的分支 git ls-files --others 展示所有被忽略的文件 git ls-files --others -i --exclude-standard git check-ignore* git status --ignored Manipulation:操作 停止追踪某个文件但是不删除它 git rm --cached <file_path 或者 git rm --cached -r <directory_path 强制删除未被追踪的文件或者目录 git clean -f git clean -f -d git clean -df 清空.gitignore git clean -X -f Changes:修改 Info:信息查看 查看上次提交之后的未暂存文件 git diff 查看准备用于提交的暂存了的修改的文件 git diff --cached 显示所有暂存与未暂存的文件 git diff HEAD 查看最新的文件版本与Stage中区别 git diff --staged dd:追踪某个修改,准备提交 Stage某个文件的部分修改而不是全部 git add -p Reset:修改重置 以HEAD中的最新的内容覆盖某个本地文件的修改 git checkout -- <file_name> Stash:贮存 Info:信息查看 展示所有保存的Stashes git stash list Manipulation:操作 Save:保存 保存当前追踪的文件修改状态而不提交,并使得工作空间恢复干净 git stash 或者 git stash save 保存所有文件修改,包括未追踪的文件 git stash save -u 或者 git stash save --include-untracked Apply:应用 应用任何的Stash而不从Stash列表中删除 git stash apply <stash@{n}> 应用并且删除Stash列表中的最后一个 git stash pop 或者 git stash apply stash@{0} && git stash drop stash@{0} 删除全部存储的Stashes git stash clear 或者 git stash drop <stash@{n}> 从某个Stash中应用单个文件 git checkout <stash@{n}> -- <file_path> 或者 git checkout stash@{0} -- <file_path> Commit:提交 检索某个提交的Hash值 git rev-list --reverse HEAD | head -1 Info:信息查看 List:Commit列表 查看自Fork Master以来的全部提交 git log --no-merges --stat --reverse master.. 展示当前分支中所有尚未合并到Master中的提交 git cherry -v master 或者 git cherry -v master <branch-to-be-merged> 可视化地查看整个Version树
竹清
2018/08/31
7020
git如何移除某文件的版本控制
最后 gti commit -m ‘提交.gitignore’
全栈程序员站长
2022/07/07
8560
git忽略已经提交的文件
开发的时候有时候需要对已经提交的文件做忽略处理,这时候直接添加到.gitignore中是不行的。 需要忽略已跟踪文件的变动: git update-index --assume-unchanged <file> 撤销忽略跟踪 git update-index --no-assume-unchanged <file>
码农二狗
2018/06/29
8060
原 GIT忽略本地已存在文件的修改
1、将文件修改忽略 git update-index --assume-unchanged FILENAME 2、取消文件忽略 git update-index --no-assume-unchanged FILENAME 如果文件未上传到库中,并为提交到本地版本库中记录,最好使用: .gitignore
霡霂
2018/06/04
2.5K0
git解决error: Your local changes to the following files would be overwritten by merge
解决error: Your local changes to the following files would be overwritten by merge
拓荒者
2019/09/25
3.1K0
Git忽略提交规则 .gitignore文件(下)
比如你的项目是java项目,.java文件编译后会生成.class文件,这些文件多数情况下是不想被传到仓库中的文件。这时候你可以直接适用github的.gitignore文件模板。https://github.com/github/gitignore/blob/master/Java.gitignore 将这些忽略文件信息复制到你的.gitignore文件中去:
陈不成i
2021/06/07
1.9K0
GitHub三天超4K星:玩转Git的72个神奇技巧
大家在用Git写东西的时候都用过 “回撤” 这个功能,但是回撤只能回撤几步,假如想要找回我三天之前的修改,光用 “回撤” 是找不回来的。
新智元
2019/05/08
9430
GitHub三天超4K星:玩转Git的72个神奇技巧
版本控制工具——Git常用操作(下)
摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复现场的操作。学会以后已经足够我们使用Git参加协作开发了,但是在开发的过程中难免会出错,本文主要介绍版本控制的过程中出错了的场景,以及Git开发的一些技巧,让我们用的更流畅。
机智的程序员小熊
2019/01/10
9690
版本控制工具——Git常用操作(下)
Git常见场景解决方法总结
1. 新建临时分支, git checkout-b new_branch,这样改动会被带到新分支。
winty
2019/12/20
5960
Git 的奇技淫巧
Git是一个 “分布式版本管理工具”,简单的理解版本管理工具:大家在写东西的时候都用过 “回撤” 这个功能,但是回撤只能回撤几步,假如想要找回我三天之前的修改,光用 “回撤” 是找不回来的。而 “版本管理工具” 能记录每次的修改,只要提交到版本仓库,你就可以找到之前任何时刻的状态(文本状态)。
iMike
2019/07/29
1.2K0
相关推荐
git设置忽略同步的文件或文件夹
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文