永久排除某些跟踪文件
Posted
技术标签:
【中文标题】永久排除某些跟踪文件【英文标题】:Exclude some tracked files from being committed permanently 【发布时间】:2019-09-21 03:07:35 【问题描述】:我正在处理一个项目,在该项目中我编辑了一些由 Git跟踪 的文件。假设编辑后的跟踪文件是:
files1.py
file2.py
file3.py
所有这些文件都存在于远程存储库中。但是,我编辑了其中一个文件(说file2.py
),使其仅与我的机器兼容。所以在提交时,我不希望这个文件被提交(我希望这个文件的远程版本保持不变)。
我知道有这样的命令:
从这个link
git add
git reset --file2.py
或者来自这个link:git update-index --assume-unchanged "file2.py"
然而,我想要的是这个文件将在以后的每次提交中被忽略,而不是每次都运行上面的命令。
有没有类似于.gitignore
的方法可以让这个文件每次都被自动忽略,并且始终保持远程版本不变?
【问题讨论】:
没有。git update-index
是唯一的方法。更好的方法是根本不提交本地文件:***.com/search?q=%5Bgit%5D+application+configuration
@phd,感谢您的评论。如何将提到的文件从跟踪更改为本地?
git rm --cached file2.py
但请理解,在您推送更改后,从该存储库中提取的每个人都会删除该文件。即使您在签出不同的分支然后返回时也会删除文件。
感谢您的解释,我认为最好最安全的解决方案是使用git update-index
【参考方案1】:
您可以使用pre-commit hook 做您想做的事:
预提交 这个钩子由
git-commit
调用,可以用--no-verify
选项绕过。它不带任何参数,并在获取建议的提交日志消息并进行提交之前被调用。从该脚本中以非零状态退出会导致 git commit 命令在创建提交之前中止。
下面的简单代码在提交之前立即取消对file2.py
的任何更改,并拒绝创建任何新的空提交——也就是说,如果唯一更改的文件是file2.py
。
#! /bin/bash
if ! git diff-index --quiet --cached HEAD -- file2.py; then
echo Discarding file2.py changes from the index
git reset HEAD -- file2.py
if git diff-index --quiet --cached HEAD; then
echo Aborting empty commit 1>&2
exit 1
fi
fi
既然学术问题已经得到解答,我建议使用不同的方法,因为该钩子有意将控制 file2.py
两种不同风格的版本的工作转给人类用户。如果你想做手动版本控制,为什么要使用 git?
相反,让 git 完成它擅长的工作,将你的更改放到一个单独的分支中
git checkout --no-track -b feature/singrium origin/master
随着 master 的变化(你可以通过运行 git fetch
赶上)
git checkout feature/singrium
git rebase origin/master
或您定期将来自 master 的更改合并到其中。
git checkout feature/singrium
git merge origin/master
git rebase
和git merge
之间的区别在于它们各自产生的历史记录。如果您对file2.py
的更改很小并且本地化为少量提交,那么rebase 方法会将这些提交作为补丁保存在最新的master 之上。如果您的历史记录更笨重,合并可能会更容易,至少在短期内是这样。
【讨论】:
感谢您的解释!以上是关于永久排除某些跟踪文件的主要内容,如果未能解决你的问题,请参考以下文章