Make git support core.gitattributesRevision for bare repo
At the moment some code depends on Rails calling `ApplyGitattributes`. This RPC copies `HEAD:.gitattributes` (being `.gitattributes` at the `HEAD` revision of the default branch) into `repo-path.git/info/attributes`. This makes sure some machinery in Git uses attributes like `merge=union`.
This isn't great for a few reasons:
- It's racy. It's not guaranteed the content of `info/attributes` is up-to-date at all times.
- It does not support `.gitattributes` subtrees. Technically a `.gitattributes` file in a subtree should override all settings in the root.
### Example
This is relevant for the [linguist attributes](https://github.com/github/linguist/blob/master/docs/overrides.md). Consider this repo:
```sh
$ tree -asI .git/
[ 120] .
├── [ 100] docu
│ ├── [ 63] generate.rb
│ ├── [ 35] .gitattributes
│ └── [ 38] install.md
├── [ 29] .gitattributes
└── [ 61] main.rb
1 directory, 5 files
$ cat .gitattributes
docu/* linguist-documentation
$ cat docu/.gitattributes
generate.rb -linguist-documentation
$ github-linguist
100.00% 124 Ruby
$ git check-attr -a docu/generate.rb
docu/generate.rb: diff: ruby
docu/generate.rb: linguist-documentation: unset
```
All this works as expected.
But when you clone this into a bare repo:
```sh
$ git clone --bare repo.git
$ github-linguist
100.00% 124 Ruby
$ git check-attr -a docu/generate.rb
docu/generate.rb: diff: ruby
$ git cat-file blob main:.gitattributes > info/attributes
docu/generate.rb: diff: ruby
docu/generate.rb: linguist-documentation: set
```
`github-linguist` works correctly, but `git-check-attr(1)` doesn't.
### Proposal
We add a config option to Git, something like `core.gitattributesRevision`. This option we use in all relevant git calls and we pass the revision of the HEAD commit (default branch). Git inner machinery should then use this revision to read all the gitattributes for the whole tree of that revision.
After this we should retire the `ApplyGitattributes` RPC.
issue