如何在不使用.gitignore的情况下让Git忽略文件?

由于外部奇怪的限制,我无法修改我的存储库的.gitignore。除了修改.gitignore之外,还有其他方法可以忽略文件和目录吗?即使它是一个全局解决方案,比如将应用于我的所有存储库的全局配置。

72814 次浏览

If you can modify .git/info/exclude you can put the same rules there. But that file is within your local repo only.

There are three ways to tell GIT which files to ignore:

  • .gitignore files
  • $GIT_DIR/.git/info/exclude
  • Files pointed to via the core.excludesfile setting

The latter two points could solve your problem.

For further information, see gitignore(5).

Do not forget, according to gitignore, that there is an order of precedence in the different "ignore pattern sources" that Git consider:

  • Patterns read from the command line for those commands that support them.
  • Patterns read from a .gitignore file in the same directory as the path, or in any parent directory, with patterns in the higher level files (up to the root) being overridden by those in lower level files down to the directory containing the file.
  • Patterns read from $GIT_DIR/info/exclude.
  • Patterns read from the file specified by the configuration variable core.excludesfile.

The last two can be a solution for your problem but:

  • they are not replicated for a distant repository
  • they can have their patterns overridden by the other sources

(See also this SO question)


The other two solutions involve updating the index (git update-index):

However, when you checkout another branch or when you git pull, that "ignore" status might be reset. Hence the other option:

The difference between the two is explained in "Git - Difference Between '__ABC0' and 'skip-worktree'".

Ignore local changes to tracked files: git update-index --assume-unchanged my-file.php

Unignore local changes to tracked files: git update-index --no-assume-unchanged my-file.php

source: git help update-index

--[no-]assume-unchanged
...
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). Git will fail (gracefully) in case it needs to
modify this file in the index e.g. when merging in a commit; thus, in case the assumed-untracked file is
changed upstream, you will need to handle the situation manually.

If you just want to have some local files in the repository and the subdirectory location is flexible, you can put your files in tracked_dir1/tracked_dir2/untracked_dir/ and then add a tracked_dir1/tracked_dir2/untracked_dir/.gitignore with contents like:

*

I.e.

$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
*
<Ctrl+D>

You can use the global gitignore method instead of modifying the one in the project https://help.github.com/articles/ignoring-files/#create-a-global-gitignore

I have been in similar situations, so I'm adding my preferred solution that I don't see mentioned. The problem with git update-index --assume-unchanged in this case is that you cannot do that for an untracked file. You said

I cannot modify the .gitignore of my repository.

I'm going to assume what you mean is that you can't push any changes to .gitignore to origin. If that is the case what you can do is add the untracked file to your local .gitignore, then do git update-index --assume-unchanged .gitignore so that your change to .gitignore is never pushed. Now you are ignoring the (possibly) untracked file, and not affecting the remote .gitignore file.

Another way:

  • edit local .gitignore
  • then git update-index --assume-unchanged .gitignore