我可以在本地忽略文件而不污染其他所有人的全局 git 配置吗?我的 git status 中有未跟踪的垃圾邮件文件,但我不想为本地分支中的每个小的随机未跟踪文件提交 git config 更改。
13 回答
特定于特定存储库但不需要与其他相关存储库共享的模式(例如,存在于存储库内但特定于一个用户工作流的辅助文件)应该进入
$GIT_DIR/info/exclude
文件。
该.git/info/exclude
文件与任何文件具有相同的格式.gitignore
。另一种选择是设置core.excludesFile
为包含全局模式的文件的名称。
请注意,如果您已经有未暂存的更改,则必须在编辑忽略模式后运行以下命令:
git update-index --assume-unchanged <file-list>
注意$GIT_DIR
:这是一个在整个 git 手册中都使用的符号,仅用于指示 git 存储库的路径。如果设置了环境变量,那么它将覆盖您所在的任何 repo 的位置,这可能不是您想要的。
编辑:另一种方法是使用:
git update-index --skip-worktree <file-list>
通过以下方式反转它:
git update-index --no-skip-worktree <file-list>
更新:考虑git update-index --skip-worktree [<file>...]
改用,谢谢@danShumway!请参阅Borealid 对两种选项差异的解释。
老答案:
如果您需要忽略对跟踪文件的本地更改(我们对配置文件进行了本地修改),请使用git update-index --assume-unchanged [<file>...]
.
将以下行添加到 .gitconfig 文件的 [alias] 部分
ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"
现在您可以使用git ignore my_file
忽略对本地文件git unignore my_file
的更改,并停止忽略更改。git ignored
列出被忽略的文件。
这个答案是从http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html收集的。
你有几个选择:
.gitignore
在您的工作目录中留下一个脏(或未提交的)文件(或使用topgit或其他类似的补丁工具自动应用它)。$GIT_DIR/info/exclude
如果这是特定于一棵树,则将排除项放入您的文件中。- 运行
git config --global core.excludesfile ~/.gitignore
并将模式添加到您的~/.gitignore
. 如果您想忽略所有树中的某些模式,则此选项适用。例如,我将它用于.pyc
和.pyo
文件。
此外,请确保您使用的是模式而不是明确枚举文件(如果适用)。
我认为您正在寻找:
git update-index --skip-worktree FILENAME
忽略本地所做的更改
这是http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/有关这些解决方案的更多说明!
撤消使用:
git update-index --no-skip-worktree FILENAME
您可以简单地将 .gitignore 文件添加到您的主目录,即$HOME/.gitignore
或~/.gitignore
. 然后通过以下命令告诉 git 使用该文件:
git config --global core.excludesfile ~/.gitignore
这是一个普通的 .gitignore 文件,git 在决定忽略什么时会引用它。由于它位于您的主目录中,因此它仅适用于您并且不会污染任何项目 .gitignore 文件。
多年来,我一直在使用这种方法并取得了很好的效果。
你可以安装一些git 别名来简化这个过程。这将编辑文件的[alias]
节点.gitconfig
。
git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'
为您安装的快捷方式如下:
git ignore config.xml
- git 会假装它没有看到任何更改
config.xml
——防止您意外提交这些更改。
- git 会假装它没有看到任何更改
git unignore config.xml
- git 将继续确认您的更改
config.xml
- 允许您再次提交这些更改。
- git 将继续确认您的更改
git ignored
- git 将以上述方式列出您“忽略”的所有文件。
我通过参考phatmann 的回答来构建这些- 它提供了--assume-unchanged
相同的版本。
我提供的版本--skip-worktree
用于忽略本地更改。有关差异的完整解释,请参阅Borealid 的回答--skip-worktree
,但本质上,其目的是让开发人员更改文件,而不会有提交更改的风险。
此处显示的git ignored
命令使用, 并过滤列表以仅显示以标记git ls-files -v
开头的条目。S
该S
标签表示状态为“跳过工作树”的文件。有关显示的文件状态的完整列表git ls-files
:请参阅有关-t
选项的文档git ls-files
。
这是一种简单的解决方案,在本地排除文件中添加一行。
echo YOURFILE_OR_DIRECTOY >> .git/info/exclude
--assume-unchanged 和 --skip-worktree 都不是在本地忽略文件的正确方法......请检查这个答案和git update-index文档中的注释。出于任何原因经常更改(和/或从克隆更改为另一个)并且不应提交其更改的文件,则不应首先跟踪这些文件。
但是,有两种在本地忽略文件的正确方法(都适用于未跟踪的文件)。要么将文件名放在 .git/info/exclude 文件中,这是 .gitignore 的本地替代方案,但特定于当前克隆。或者使用全局 .gitignore(它应该仅用于常见的辅助文件,例如 pyz、pycache 等),并且该文件将在您机器中的任何 git repo 中被忽略。
要使上述内容自动化(添加到排除或全局 .gitignore),您可以使用以下命令(添加到您的 bash 配置文件):
- 每个克隆本地排除(请注意,由于使用相对路径,调用命令时您应该在存储库的根目录中),将 ##FILE-NAME## 更改为
.git/info/exclude
- 全局 .gitignore,首先在此处生成全局 .gitignore,然后将 ##FILE-NAME## 更改为
~/.gitignore
Linux
alias git-ignore='echo $1 >> ##FILE-NAME##'
alias git-show-ignored='cat ##FILE-NAME##'
git-unignore(){
GITFILETOUNIGNORE=${1//\//\\\/}
sed -i "/$GITFILETOUNIGNORE/d" ##FILE-NAME##
unset GITFILETOUNIGNORE
}
MacOS(您需要 .bak 进行sed
就地修改(即,您被迫为就地 sed 添加文件扩展名。即在替换某些内容之前进行备份),因此要删除 .bak 文件,我添加了 rm filename.bak)
alias git-ignore='echo $1 >> ##FILE-NAME##'
alias git-show-ignored='cat ##FILE-NAME##'
git-unignore(){
GITFILETOUNIGNORE=${1//\//\\\/}
sed -i.bak "/$GITFILETOUNIGNORE/d" ##FILE-NAME##
rm ##FILE-NAME##.bak
unset GITFILETOUNIGNORE
}
然后你可以这样做:
git-ignore example_file.txt
git-unignore example_file.txt
为了忽略未跟踪的文件,特别是如果它们位于(几个)未跟踪的文件夹中,一个简单的解决方案是向.gitignore
每个未跟踪的文件夹添加一个文件,然后在一行中输入一个包含*
后跟一个新行的文件。如果未跟踪的文件位于几个文件夹中,这是一个非常简单直接的解决方案。对我来说,所有文件都来自一个未跟踪的文件夹vendor
,而上面的只是工作。
对于想要在子模块中本地忽略文件的任何人:
my-parent-repo/.git/modules/my-submodule/info/exclude
使用与文件相同的格式进行编辑.gitignore
。
只需将路径添加到 ypu 想要从当前 repo 的任何分支上的提交中删除的文件:
- 在 Windows 目录设置中取消隐藏隐藏文件
- 打开路径 REPO_MAIN_PATH/.git/info/exclude
- 例如添加 **/toExcludeFile.bat
就是这样!对我来说,上面的回答太长了。KISS - 保持简单
如果您的 repo 还没有 .gitignore 文件,那么一个简单的解决方案是创建一个 .gitignore 文件,并在其中添加.gitignore
要忽略的文件列表。