我可以在本地忽略文件而不会污染全局git配置以便其他人使用吗?我有一些未被追踪的文件在我的git状态中,但我不想为我本地分支中的每个小随机未被追踪的文件提交git配置更改。
来自相关的Git文档:
特定于某个仓库但不需要与其他相关仓库共享的模式(例如,存储在仓库内但特定于一个用户工作流程的辅助文件)应放入
$GIT_DIR/info/exclude
文件中。
.git/info/exclude
文件具有与任何.gitignore
文件相同的格式。另一种选择是将core.excludesFile
设置为包含全局模式的文件名。
请注意,如果您已经有未暂存的更改,则必须在编辑忽略模式后运行以下命令:
git update-index --assume-unchanged <file-list>
关于$GIT_DIR
的说明:这是Git手册中广泛使用的一种表示Git仓库路径的符号。如果设置了环境变量,则会覆盖当前所在的仓库位置,这可能不是您想要的。
编辑:另一种方法是使用:
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>...]
。
git update-index --assume-unchanged my-file.php
才能开始忽略它。感谢这个技巧! - tollmanzgit update-index --no-assume-unchanged my-file.php
。 - Ray.git/info/exclude
(以避免污染经常共享和被跟踪的 .gitignore 文件)。 - dyodji--assume-unchanged
。我用--no-assume-unchanged
撤销了它,然后再使用--skip-worktree
... 我现在没问题了吗? - Nicolas Miari将以下行添加到您的 .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 config --global
命令来全局设置选项。 - Josh Lee我想您正在寻找:
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
--skipworktree
忽略的文件/模式列表,以便稍后改变主意并重新开始跟踪文件? - Anomalygit update-index --no-skip-worktree <file>
命令来撤销操作。 - user1735921git ls-files -v | grep ^S
命令。 - Ahmed Kareemgit update-index --assume-unchanged $(git ls-files | tr '\n' ' ')
命令,参见此答案。 - gustavozapata您可以在您的主目录中添加一个.gitignore文件,即$ HOME/.gitignore
或~/.gitignore
。然后使用以下命令告诉git使用该文件:
git config --global core.excludesfile ~/.gitignore
这是一个正常的 .gitignore 文件,当 Git 决定要忽略什么时,会引用它。由于它位于您的主目录中,因此仅适用于您,不会污染任何项目的 .gitignore 文件。
我已经使用这种方法多年并取得了很好的效果。
git check-ignore <文件名>
进行验证。如果可行,请告知我。 - JESiigit config --global core.excludesfile ~/.gitignore
。 - E. Sundin.gitignore
文件,并告诉git使用该文件,然后删除了我想要取消跟踪的本地文件。但是,在我推送更改之后,远程存储库也删除了这些文件。我做错了什么吗? - zyy.gitignore
是用于忽略存在于本地目录中的文件。你应该做的是使用 git rm --cached
命令将它们从仓库中删除但保留在本地。你可以通过类似 git reset --soft HEAD^
的命令回到之前的提交并恢复你的文件。这就是 Git 的美妙之处:所有的历史记录都还在那里。 - JESii.gitconfig
文件中的[alias]
节点。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
config.xml
的变化,防止你意外提交这些变化。git unignore config.xml
config.xml
所做的更改,允许你再次提交这些更改。git ignored
我参考了phatmann的答案来构建这些内容,他提出了一个使用--assume-unchanged
的版本。
我所呈现的版本使用--skip-worktree
来忽略本地更改。有关区别的完整解释,请参见Borealid的答案,但基本上--skip-worktree
的目的是让开发人员在不提交更改的情况下更改文件。
这里呈现的git ignored
命令使用git ls-files -v
,并过滤列表,只显示以S
标记开头的条目。 S
标记表示状态为“跳过工作树”的文件。有关git ls-files
显示的完整文件状态列表:请参阅git ls-files
的-t
选项的文档。
usage: git config [<options>]
。 - obeliksz这是一个简短的一行代码,用于排除本地文件。
echo YOUR_FILE_OR_DIRECTORY >> .git/info/exclude
根据@Vanduc1102的评论。如果没有应用,请在此之后运行以下命令。
git update-index --assume-unchanged YOUR_FILE_OR_DIRECTORY
git update-index --assume-unchanged YOUR_FILE_OR_DIRECTORY
。 - vanduc1102--assume-unchanged和--skip-worktree都不是忽略本地文件的正确方式... 请查看此答案以及git update-index的文档中的注释。对于任何原因经常更改(和/或从一个克隆到另一个更改)且其更改不应提交的文件,则这些文件不应该首先被跟踪。
但是,有两种适当的方法可以在本地忽略文件(两者都适用于未跟踪的文件)。一种是将文件名放入.git/info/exclude文件中,它是.gitignore的本地替代版本,但特定于当前克隆。或使用全局.gitignore(应仅适用于常见的辅助文件,如pyz、pycache等),该文件将在您机器上的任何git repo中被忽略。
要将上述内容自动化(添加到exclude或全局.gitignore中),您可以使用以下命令(将其添加到bash-profile中):
.git/info/exclude
~/.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(如果您想要使用sed
进行原地修改(即您被强制添加文件扩展名以进行原地替换),则需要.bak文件,因此为了删除.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
git update-index --assume-unchanged [<file>...]
。在那之前,这些更改不会被记录。 - tollmanzassume-unchanged
更受青睐。 - danShumway