Full Code of git-lfs/git-lfs for AI

main 0a45b99f9fa8 cached
631 files
2.8 MB
763.6k tokens
2860 symbols
1 requests
Download .txt
Showing preview only (3,036K chars total). Download the full file or copy to clipboard to get everything.
Repository: git-lfs/git-lfs
Branch: main
Commit: 0a45b99f9fa8
Files: 631
Total size: 2.8 MB

Directory structure:
gitextract_xn00bgit/

├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── other-issue.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── ci.yml
│       └── release.yml
├── .gitignore
├── .mailmap
├── .ruby-version
├── CHANGELOG.md
├── CODE-OF-CONDUCT.md
├── CONTRIBUTING.md
├── INSTALLING.md
├── LICENSE.md
├── Makefile
├── README.md
├── SECURITY.md
├── commands/
│   ├── command_checkout.go
│   ├── command_clean.go
│   ├── command_clone.go
│   ├── command_dedup.go
│   ├── command_env.go
│   ├── command_ext.go
│   ├── command_fetch.go
│   ├── command_filter_process.go
│   ├── command_fsck.go
│   ├── command_install.go
│   ├── command_lock.go
│   ├── command_locks.go
│   ├── command_logs.go
│   ├── command_ls_files.go
│   ├── command_merge_driver.go
│   ├── command_migrate.go
│   ├── command_migrate_export.go
│   ├── command_migrate_import.go
│   ├── command_migrate_info.go
│   ├── command_pointer.go
│   ├── command_post_checkout.go
│   ├── command_post_commit.go
│   ├── command_post_merge.go
│   ├── command_pre_push.go
│   ├── command_prune.go
│   ├── command_pull.go
│   ├── command_push.go
│   ├── command_smudge.go
│   ├── command_standalone_file.go
│   ├── command_status.go
│   ├── command_track.go
│   ├── command_uninstall.go
│   ├── command_unlock.go
│   ├── command_untrack.go
│   ├── command_update.go
│   ├── command_version.go
│   ├── commands.go
│   ├── commands_test.go
│   ├── lockverifier.go
│   ├── multiwriter.go
│   ├── path.go
│   ├── path_nix.go
│   ├── path_windows.go
│   ├── pointers.go
│   ├── pull.go
│   ├── run.go
│   ├── uploader.go
│   └── uploader_test.go
├── config/
│   ├── config.go
│   ├── config_test.go
│   ├── delayed_environment.go
│   ├── environment.go
│   ├── environment_test.go
│   ├── extension.go
│   ├── extension_test.go
│   ├── fetcher.go
│   ├── git_fetcher.go
│   ├── git_fetcher_test.go
│   ├── map_fetcher.go
│   ├── os_fetcher.go
│   ├── url_config.go
│   ├── url_config_test.go
│   ├── util_nix.go
│   ├── util_windows.go
│   └── version.go
├── creds/
│   ├── access.go
│   ├── creds.go
│   ├── creds_test.go
│   ├── netrc.go
│   └── netrc_test.go
├── debian/
│   ├── changelog
│   ├── compat
│   ├── control
│   ├── copyright
│   ├── git-lfs.lintian-overrides
│   ├── git-lfs.manpages
│   ├── postinst
│   ├── prerm
│   ├── rules
│   └── source/
│       └── format
├── docker/
│   ├── README.md
│   └── run_dockers.bsh
├── docs/
│   ├── README.md
│   ├── api/
│   │   ├── README.md
│   │   ├── authentication.md
│   │   ├── basic-transfers.md
│   │   ├── batch.md
│   │   ├── locking.md
│   │   └── server-discovery.md
│   ├── custom-transfers.md
│   ├── extensions.md
│   ├── howto/
│   │   └── release-git-lfs.md
│   ├── l10n.md
│   ├── man/
│   │   ├── asciidoctor-extensions/
│   │   │   └── manpage-extension.rb
│   │   ├── git-lfs-checkout.adoc
│   │   ├── git-lfs-clean.adoc
│   │   ├── git-lfs-clone.adoc
│   │   ├── git-lfs-completion.adoc
│   │   ├── git-lfs-config.adoc
│   │   ├── git-lfs-dedup.adoc
│   │   ├── git-lfs-env.adoc
│   │   ├── git-lfs-ext.adoc
│   │   ├── git-lfs-faq.adoc
│   │   ├── git-lfs-fetch.adoc
│   │   ├── git-lfs-filter-process.adoc
│   │   ├── git-lfs-fsck.adoc
│   │   ├── git-lfs-install.adoc
│   │   ├── git-lfs-lock.adoc
│   │   ├── git-lfs-locks.adoc
│   │   ├── git-lfs-logs.adoc
│   │   ├── git-lfs-ls-files.adoc
│   │   ├── git-lfs-merge-driver.adoc
│   │   ├── git-lfs-migrate.adoc
│   │   ├── git-lfs-pointer.adoc
│   │   ├── git-lfs-post-checkout.adoc
│   │   ├── git-lfs-post-commit.adoc
│   │   ├── git-lfs-post-merge.adoc
│   │   ├── git-lfs-pre-push.adoc
│   │   ├── git-lfs-prune.adoc
│   │   ├── git-lfs-pull.adoc
│   │   ├── git-lfs-push.adoc
│   │   ├── git-lfs-smudge.adoc
│   │   ├── git-lfs-standalone-file.adoc
│   │   ├── git-lfs-status.adoc
│   │   ├── git-lfs-track.adoc
│   │   ├── git-lfs-uninstall.adoc
│   │   ├── git-lfs-unlock.adoc
│   │   ├── git-lfs-untrack.adoc
│   │   ├── git-lfs-update.adoc
│   │   ├── git-lfs.adoc
│   │   └── mangen.go
│   ├── proposals/
│   │   ├── README.md
│   │   ├── locking.md
│   │   ├── locking_api.md
│   │   ├── locking_notes.md
│   │   ├── multipart_transfer_mode.md
│   │   ├── ntlm.md
│   │   ├── ssh_adapter.md
│   │   └── transfer_adapters.md
│   └── spec.md
├── errors/
│   ├── context.go
│   ├── errors.go
│   ├── errors_test.go
│   ├── types.go
│   └── types_test.go
├── filepathfilter/
│   ├── filepathfilter.go
│   └── filepathfilter_test.go
├── fs/
│   ├── cleanup.go
│   ├── fs.go
│   └── fs_test.go
├── git/
│   ├── config.go
│   ├── config_test.go
│   ├── filter_process_scanner.go
│   ├── filter_process_scanner_test.go
│   ├── filter_process_status.go
│   ├── git.go
│   ├── git_test.go
│   ├── gitattr/
│   │   ├── attr.go
│   │   ├── attr_test.go
│   │   ├── files.go
│   │   ├── macro.go
│   │   ├── macro_test.go
│   │   ├── tree.go
│   │   └── tree_test.go
│   ├── githistory/
│   │   ├── fixtures/
│   │   │   ├── identical-blobs.git/
│   │   │   │   ├── HEAD
│   │   │   │   ├── config
│   │   │   │   ├── index
│   │   │   │   ├── logs/
│   │   │   │   │   ├── HEAD
│   │   │   │   │   └── refs/
│   │   │   │   │       └── heads/
│   │   │   │   │           └── master
│   │   │   │   ├── objects/
│   │   │   │   │   ├── 42/
│   │   │   │   │   │   └── 723ad796caa500ddf4e3f6ad37600ed5a65491
│   │   │   │   │   ├── 94/
│   │   │   │   │   │   └── f3610c08588440112ed977376f26a8fba169b0
│   │   │   │   │   └── b6/
│   │   │   │   │       └── 2b45ed2b59cf32dd676ca47497e76a1dab9c7e
│   │   │   │   └── refs/
│   │   │   │       └── heads/
│   │   │   │           └── master
│   │   │   ├── linear-history-with-annotated-tags.git/
│   │   │   │   ├── HEAD
│   │   │   │   ├── config
│   │   │   │   ├── index
│   │   │   │   ├── logs/
│   │   │   │   │   ├── HEAD
│   │   │   │   │   └── refs/
│   │   │   │   │       └── heads/
│   │   │   │   │           └── master
│   │   │   │   ├── objects/
│   │   │   │   │   ├── 05/
│   │   │   │   │   │   └── 797a38b05f910e6efe40dc1a5c0a046a9403e8
│   │   │   │   │   ├── 20/
│   │   │   │   │   │   └── ecedad3e74a113695fe5f00ab003694e2e1e9c
│   │   │   │   │   ├── 22/
│   │   │   │   │   │   └── 8afe30855933151f7a88e70d9d88314fd2f191
│   │   │   │   │   ├── 2e/
│   │   │   │   │   │   └── 65efe2a145dda7ee51d1741299f848e5bf752e
│   │   │   │   │   ├── 34/
│   │   │   │   │   │   └── 10062ba67c5ed59b854387a8bc0ec012479368
│   │   │   │   │   ├── 3c/
│   │   │   │   │   │   └── b3201d7942353fff5f45e03d114e8e7a061f87
│   │   │   │   │   ├── 4a/
│   │   │   │   │   │   └── 78e180c45f18489941174df19d538c26d5318b
│   │   │   │   │   ├── 52/
│   │   │   │   │   │   └── a8963f48d54c7d352695a278ca4b025e130cb4
│   │   │   │   │   ├── 63/
│   │   │   │   │   │   └── d8dbd40c23542e740659a7168a0ce3138ea748
│   │   │   │   │   ├── 6b/
│   │   │   │   │   │   └── de0b381fa1a039396445e2ce5a28c0451fde15
│   │   │   │   │   ├── 91/
│   │   │   │   │   │   └── b85be6928569390e937479509b80a1d0dccb0c
│   │   │   │   │   └── d9/
│   │   │   │   │       └── 41e4756add6b06f5bee766fcf669f55419f13f
│   │   │   │   └── refs/
│   │   │   │       ├── heads/
│   │   │   │       │   └── master
│   │   │   │       └── tags/
│   │   │   │           └── middle
│   │   │   ├── linear-history-with-tags.git/
│   │   │   │   ├── HEAD
│   │   │   │   ├── config
│   │   │   │   ├── index
│   │   │   │   ├── logs/
│   │   │   │   │   ├── HEAD
│   │   │   │   │   └── refs/
│   │   │   │   │       └── heads/
│   │   │   │   │           └── master
│   │   │   │   ├── objects/
│   │   │   │   │   ├── 20/
│   │   │   │   │   │   └── ecedad3e74a113695fe5f00ab003694e2e1e9c
│   │   │   │   │   ├── 22/
│   │   │   │   │   │   └── 8afe30855933151f7a88e70d9d88314fd2f191
│   │   │   │   │   ├── 2e/
│   │   │   │   │   │   └── 65efe2a145dda7ee51d1741299f848e5bf752e
│   │   │   │   │   ├── 34/
│   │   │   │   │   │   └── 10062ba67c5ed59b854387a8bc0ec012479368
│   │   │   │   │   ├── 3c/
│   │   │   │   │   │   └── b3201d7942353fff5f45e03d114e8e7a061f87
│   │   │   │   │   ├── 52/
│   │   │   │   │   │   └── a8963f48d54c7d352695a278ca4b025e130cb4
│   │   │   │   │   ├── 63/
│   │   │   │   │   │   └── d8dbd40c23542e740659a7168a0ce3138ea748
│   │   │   │   │   ├── 91/
│   │   │   │   │   │   └── b85be6928569390e937479509b80a1d0dccb0c
│   │   │   │   │   └── d9/
│   │   │   │   │       └── 41e4756add6b06f5bee766fcf669f55419f13f
│   │   │   │   └── refs/
│   │   │   │       ├── heads/
│   │   │   │       │   └── master
│   │   │   │       └── tags/
│   │   │   │           └── middle
│   │   │   ├── linear-history.git/
│   │   │   │   ├── HEAD
│   │   │   │   ├── config
│   │   │   │   ├── index
│   │   │   │   ├── logs/
│   │   │   │   │   ├── HEAD
│   │   │   │   │   └── refs/
│   │   │   │   │       └── heads/
│   │   │   │   │           └── master
│   │   │   │   ├── objects/
│   │   │   │   │   ├── 56/
│   │   │   │   │   │   └── a6051ca2b02b04ef92d5150c9ef600403cb1de
│   │   │   │   │   ├── 62/
│   │   │   │   │   │   └── 811b8f930323895033b3b338c35f51c0b7268b
│   │   │   │   │   ├── 6e/
│   │   │   │   │   │   └── 07bd31cb70c4add2c973481ad4fa38b235ca69
│   │   │   │   │   ├── 71/
│   │   │   │   │   │   └── a488ec1804ee97ea651b094aa9181ca85aab0a
│   │   │   │   │   ├── c5/
│   │   │   │   │   │   └── decfe1fcf39b8c489f4a0bf3b3823676339f80
│   │   │   │   │   ├── d8/
│   │   │   │   │   │   └── 263ee9860594d2806b0dfd1bfd17528b0ba2a4
│   │   │   │   │   ├── e4/
│   │   │   │   │   │   └── 40e5c842586965a7fb77deda2eca68612b1f53
│   │   │   │   │   ├── e6/
│   │   │   │   │   │   └── 69b63f829bfb0b91fc52a5bcea53dd7977a0ee
│   │   │   │   │   └── ef/
│   │   │   │   │       └── eab7a9b61312fa56fc74eee1e0f5a714abfb70
│   │   │   │   └── refs/
│   │   │   │       └── heads/
│   │   │   │           └── master
│   │   │   ├── non-repeated-subtrees.git/
│   │   │   │   ├── HEAD
│   │   │   │   ├── config
│   │   │   │   ├── index
│   │   │   │   ├── logs/
│   │   │   │   │   ├── HEAD
│   │   │   │   │   └── refs/
│   │   │   │   │       └── heads/
│   │   │   │   │           └── master
│   │   │   │   ├── objects/
│   │   │   │   │   ├── 07/
│   │   │   │   │   │   └── bd7fbfc41b7d36135bcffe7c465490f4aca32d
│   │   │   │   │   ├── 12/
│   │   │   │   │   │   └── 7ececad475cde6da0048051d62121cabd23194
│   │   │   │   │   ├── 19/
│   │   │   │   │   │   └── acdd81ab0abc15c771fe005bf1c2825e4e6080
│   │   │   │   │   ├── 37/
│   │   │   │   │   │   └── f99c7f2706d317b3bf7ff13d574eef33d8788a
│   │   │   │   │   ├── 3d/
│   │   │   │   │   │   └── 1baaaceec085c52e3e57a47a75b87b7615d0ef
│   │   │   │   │   ├── 8d/
│   │   │   │   │   │   └── 14cbf983b3fad683171c9418998d9f68340823
│   │   │   │   │   └── bc/
│   │   │   │   │       └── 63077ac5e575ccc9dbbd93dc882f1e10600ea7
│   │   │   │   └── refs/
│   │   │   │       └── heads/
│   │   │   │           └── master
│   │   │   ├── octopus-merge.git/
│   │   │   │   ├── HEAD
│   │   │   │   ├── ORIG_HEAD
│   │   │   │   ├── config
│   │   │   │   ├── index
│   │   │   │   ├── logs/
│   │   │   │   │   ├── HEAD
│   │   │   │   │   └── refs/
│   │   │   │   │       └── heads/
│   │   │   │   │           ├── branch-a
│   │   │   │   │           ├── branch-b
│   │   │   │   │           └── master
│   │   │   │   ├── objects/
│   │   │   │   │   ├── 04/
│   │   │   │   │   │   └── df07b08ca746b3167d0f1d1514e2f39a52c16c
│   │   │   │   │   ├── 15/
│   │   │   │   │   │   └── 805fe2044dc1a0508853e93d1a230bd94636be
│   │   │   │   │   ├── 25/
│   │   │   │   │   │   └── 1e6b3461a3b5adc6bab694d5ae1abc878edf85
│   │   │   │   │   ├── 2e/
│   │   │   │   │   │   └── 65efe2a145dda7ee51d1741299f848e5bf752e
│   │   │   │   │   ├── 2f/
│   │   │   │   │   │   └── 3a8ec99d5b459b41b6675e52758e397c5e3103
│   │   │   │   │   ├── 5a/
│   │   │   │   │   │   └── 0581b158a81b8fc5d2169c2ac2ca7772ff13fd
│   │   │   │   │   ├── 63/
│   │   │   │   │   │   └── d8dbd40c23542e740659a7168a0ce3138ea748
│   │   │   │   │   ├── 6c/
│   │   │   │   │   │   └── 9ccaeb45446e3fa88cd5848a940fd34c18192b
│   │   │   │   │   ├── 8b/
│   │   │   │   │   │   └── e6d64cddab01f53381e9feafe50d95ca5e6629
│   │   │   │   │   ├── b6/
│   │   │   │   │   │   └── fc4c620b67d95f953a5c1c1230aaab5db5a1b0
│   │   │   │   │   └── e9/
│   │   │   │   │       └── 4edfabfb7605f7cb959b4ce8fb6652b509fe03
│   │   │   │   └── refs/
│   │   │   │       └── heads/
│   │   │   │           ├── branch-a
│   │   │   │           ├── branch-b
│   │   │   │           └── master
│   │   │   ├── packed-objects.git/
│   │   │   │   ├── HEAD
│   │   │   │   ├── config
│   │   │   │   ├── index
│   │   │   │   ├── info/
│   │   │   │   │   └── refs
│   │   │   │   ├── logs/
│   │   │   │   │   ├── HEAD
│   │   │   │   │   └── refs/
│   │   │   │   │       └── heads/
│   │   │   │   │           └── master
│   │   │   │   ├── objects/
│   │   │   │   │   ├── info/
│   │   │   │   │   │   └── packs
│   │   │   │   │   └── pack/
│   │   │   │   │       ├── pack-ac516ce2d006668dc5e001e8dda0aa1c7198500f.idx
│   │   │   │   │       └── pack-ac516ce2d006668dc5e001e8dda0aa1c7198500f.pack
│   │   │   │   └── refs/
│   │   │   │       └── heads/
│   │   │   │           └── master
│   │   │   └── repeated-subtrees.git/
│   │   │       ├── HEAD
│   │   │       ├── config
│   │   │       ├── index
│   │   │       ├── logs/
│   │   │       │   ├── HEAD
│   │   │       │   └── refs/
│   │   │       │       └── heads/
│   │   │       │           └── master
│   │   │       ├── objects/
│   │   │       │   ├── 0b/
│   │   │       │   │   └── 4747509ab885114690ff291f8f108045b1d749
│   │   │       │   ├── 12/
│   │   │       │   │   └── b98c239e8f933d213617a1b965333d478b2743
│   │   │       │   ├── 2e/
│   │   │       │   │   └── 65efe2a145dda7ee51d1741299f848e5bf752e
│   │   │       │   ├── 47/
│   │   │       │   │   └── d4d71022adc7ec6a14250d23491e535ec228f4
│   │   │       │   ├── 5e/
│   │   │       │   │   └── 497ceceb14ad3c43bac781ed5c804bc67e8f3b
│   │   │       │   ├── 63/
│   │   │       │   │   └── d8dbd40c23542e740659a7168a0ce3138ea748
│   │   │       │   ├── b9/
│   │   │       │   │   └── 621d5d84b3174de020ad2c869f43b2f61f337f
│   │   │       │   └── bc/
│   │   │       │       └── 4d1181aca5a33673d7c5d4c209d09ce1cfabd7
│   │   │       └── refs/
│   │   │           └── heads/
│   │   │               └── master
│   │   ├── fixtures_test.go
│   │   ├── ref_updater.go
│   │   ├── ref_updater_test.go
│   │   ├── rewriter.go
│   │   └── rewriter_test.go
│   ├── ls_files.go
│   ├── ls_tree_scanner.go
│   ├── ls_tree_scanner_test.go
│   ├── object_scanner.go
│   ├── refs.go
│   ├── refs_test.go
│   ├── rev_list_scanner.go
│   ├── rev_list_scanner_test.go
│   └── version.go
├── git-lfs.go
├── git-lfs_windows_386.go
├── git-lfs_windows_amd64.go
├── git-lfs_windows_arm64.go
├── go.mod
├── go.sum
├── lfs/
│   ├── attribute.go
│   ├── config.go
│   ├── config_test.go
│   ├── diff_index_scanner.go
│   ├── extension.go
│   ├── gitfilter.go
│   ├── gitfilter_clean.go
│   ├── gitfilter_smudge.go
│   ├── gitscanner.go
│   ├── gitscanner_catfilebatch.go
│   ├── gitscanner_catfilebatchcheck.go
│   ├── gitscanner_catfilebatchcheckscanner_test.go
│   ├── gitscanner_index.go
│   ├── gitscanner_log.go
│   ├── gitscanner_pointerscanner_test.go
│   ├── gitscanner_refs.go
│   ├── gitscanner_remotes.go
│   ├── gitscanner_tree.go
│   ├── hook.go
│   ├── lfs.go
│   ├── lfs_test.go
│   ├── pointer.go
│   ├── pointer_test.go
│   ├── scanner.go
│   ├── scanner_git_test.go
│   ├── scanner_test.go
│   ├── util.go
│   └── util_test.go
├── lfsapi/
│   ├── auth.go
│   ├── auth_test.go
│   ├── body.go
│   ├── client.go
│   ├── endpoint_finder.go
│   ├── endpoint_finder_test.go
│   ├── kerberos.go
│   ├── lfsapi.go
│   └── response_test.go
├── lfshttp/
│   ├── body.go
│   ├── certs.go
│   ├── certs_test.go
│   ├── client.go
│   ├── client_test.go
│   ├── cookies.go
│   ├── endpoint.go
│   ├── errors.go
│   ├── lfshttp.go
│   ├── proxy.go
│   ├── proxy_test.go
│   ├── retries.go
│   ├── retries_test.go
│   ├── ssh.go
│   ├── ssh_test.go
│   ├── standalone/
│   │   └── standalone.go
│   ├── stats.go
│   ├── stats_test.go
│   ├── verbose.go
│   └── verbose_test.go
├── locking/
│   ├── api.go
│   ├── api_test.go
│   ├── cache.go
│   ├── cache_test.go
│   ├── lockable.go
│   ├── locks.go
│   ├── locks_test.go
│   ├── schemas/
│   │   ├── http-lock-create-request-schema.json
│   │   ├── http-lock-create-response-schema.json
│   │   ├── http-lock-delete-request-schema.json
│   │   ├── http-lock-list-response-schema.json
│   │   └── http-lock-verify-response-schema.json
│   └── ssh.go
├── po/
│   └── es.po
├── rpm/
│   ├── INSTALL.md
│   ├── SPECS/
│   │   └── git-lfs.spec
│   └── build_rpms.bsh
├── script/
│   ├── build-git
│   ├── changelog
│   ├── cibuild
│   ├── compile-win-installer-unsigned.bat
│   ├── gen-i-reverse
│   ├── hash-files
│   ├── install-git-source
│   ├── install.sh
│   ├── lib/
│   │   └── distro.rb
│   ├── macos/
│   │   └── manifest.json
│   ├── notarize
│   ├── packagecloud.rb
│   ├── spec/
│   │   └── distro_spec.rb
│   ├── update-version
│   ├── upload
│   └── windows-installer/
│       └── inno-setup-git-lfs-installer.iss
├── ssh/
│   ├── connection.go
│   ├── pktline.go
│   ├── protocol.go
│   ├── ssh.go
│   └── ssh_test.go
├── subprocess/
│   ├── buffered_cmd.go
│   ├── cmd.go
│   ├── path.go
│   ├── path_nix.go
│   ├── path_windows.go
│   ├── subprocess.go
│   ├── subprocess_nix.go
│   ├── subprocess_test.go
│   └── subprocess_windows.go
├── t/
│   ├── Makefile
│   ├── README.md
│   ├── cmd/
│   │   ├── git-credential-lfsnoop.go
│   │   ├── git-credential-lfstest.go
│   │   ├── lfs-askpass.go
│   │   ├── lfs-ssh-echo.go
│   │   ├── lfs-ssh-proxy-test.go
│   │   ├── lfstest-badpathcheck.go
│   │   ├── lfstest-caseinverterextension.go
│   │   ├── lfstest-count-tests.go
│   │   ├── lfstest-customadapter.go
│   │   ├── lfstest-genrandom.go
│   │   ├── lfstest-gitserver.go
│   │   ├── lfstest-nanomtime.go
│   │   ├── lfstest-realpath.go
│   │   ├── lfstest-standalonecustomadapter.go
│   │   ├── lfstest-testutils.go
│   │   └── util/
│   │       └── testutils.go
│   ├── fixtures/
│   │   ├── completions/
│   │   │   ├── git-lfs-completion.bash
│   │   │   ├── git-lfs-completion.fish
│   │   │   └── git-lfs-completion.zsh
│   │   ├── migrate.sh
│   │   └── templates/
│   │       ├── HEAD
│   │       └── info/
│   │           └── exclude
│   ├── t-alternates.sh
│   ├── t-askpass.sh
│   ├── t-attributes.sh
│   ├── t-batch-error-handling.sh
│   ├── t-batch-retries-ratelimit.sh
│   ├── t-batch-retries.sh
│   ├── t-batch-storage-retries-ratelimit.sh
│   ├── t-batch-transfer-size.sh
│   ├── t-batch-transfer.sh
│   ├── t-batch-unknown-oids.sh
│   ├── t-checkout.sh
│   ├── t-cherry-pick-commits.sh
│   ├── t-chunked-transfer-encoding.sh
│   ├── t-clean.sh
│   ├── t-clone-deprecated.sh
│   ├── t-clone.sh
│   ├── t-commit-delete-push.sh
│   ├── t-completion.sh
│   ├── t-config.sh
│   ├── t-content-type.sh
│   ├── t-credentials-no-prompt.sh
│   ├── t-credentials-protect.sh
│   ├── t-credentials.sh
│   ├── t-custom-transfers.sh
│   ├── t-dedup.sh
│   ├── t-duplicate-oids.sh
│   ├── t-env.sh
│   ├── t-expired.sh
│   ├── t-ext.sh
│   ├── t-extra-header.sh
│   ├── t-fetch-include.sh
│   ├── t-fetch-paths.sh
│   ├── t-fetch-recent.sh
│   ├── t-fetch-refspec.sh
│   ├── t-fetch.sh
│   ├── t-filter-branch.sh
│   ├── t-filter-process.sh
│   ├── t-fsck.sh
│   ├── t-happy-path.sh
│   ├── t-install-custom-hooks-path-unsupported.sh
│   ├── t-install-custom-hooks-path.sh
│   ├── t-install-worktree-unsupported.sh
│   ├── t-install-worktree.sh
│   ├── t-install.sh
│   ├── t-lock.sh
│   ├── t-locks.sh
│   ├── t-logs.sh
│   ├── t-ls-files.sh
│   ├── t-malformed-pointers.sh
│   ├── t-merge-driver.sh
│   ├── t-mergetool.sh
│   ├── t-migrate-export.sh
│   ├── t-migrate-fixup.sh
│   ├── t-migrate-import-no-rewrite.sh
│   ├── t-migrate-import.sh
│   ├── t-migrate-info.sh
│   ├── t-multiple-remotes.sh
│   ├── t-no-remote.sh
│   ├── t-object-authenticated.sh
│   ├── t-path.sh
│   ├── t-pointer.sh
│   ├── t-post-checkout.sh
│   ├── t-post-commit.sh
│   ├── t-post-merge.sh
│   ├── t-pre-push.sh
│   ├── t-progress-meter.sh
│   ├── t-progress.sh
│   ├── t-prune-worktree.sh
│   ├── t-prune.sh
│   ├── t-pull.sh
│   ├── t-push-bad-dns.sh
│   ├── t-push-failures-local.sh
│   ├── t-push-failures-remote.sh
│   ├── t-push-file-with-branch-name.sh
│   ├── t-push.sh
│   ├── t-reference-clone.sh
│   ├── t-repo-format.sh
│   ├── t-resume-http-range.sh
│   ├── t-resume-tus.sh
│   ├── t-smudge.sh
│   ├── t-ssh.sh
│   ├── t-standalone-file.sh
│   ├── t-status.sh
│   ├── t-submodule-lfsconfig.sh
│   ├── t-submodule-recurse.sh
│   ├── t-submodule.sh
│   ├── t-tempfile.sh
│   ├── t-track-attrs.sh
│   ├── t-track-wildcards.sh
│   ├── t-track.sh
│   ├── t-umask.sh
│   ├── t-uninstall-worktree-unsupported.sh
│   ├── t-uninstall-worktree.sh
│   ├── t-uninstall.sh
│   ├── t-unlock.sh
│   ├── t-untrack.sh
│   ├── t-unusual-filenames.sh
│   ├── t-update.sh
│   ├── t-upload-redirect.sh
│   ├── t-usage.sh
│   ├── t-verify.sh
│   ├── t-version.sh
│   ├── t-worktree.sh
│   ├── t-zero-len-file.sh
│   ├── testenv.sh
│   ├── testhelpers.sh
│   └── testlib.sh
├── tasklog/
│   ├── list_task.go
│   ├── list_task_test.go
│   ├── log.go
│   ├── log_test.go
│   ├── percentage_task.go
│   ├── percentage_task_test.go
│   ├── simple_task.go
│   ├── simple_task_test.go
│   ├── task.go
│   ├── waiting_task.go
│   └── waiting_task_test.go
├── tools/
│   ├── channels.go
│   ├── copycallback.go
│   ├── copycallback_test.go
│   ├── cygwin.go
│   ├── cygwin_windows.go
│   ├── dir_walker.go
│   ├── dir_walker_test.go
│   ├── filetools.go
│   ├── filetools_nix.go
│   ├── filetools_test.go
│   ├── filetools_windows.go
│   ├── humanize/
│   │   ├── humanize.go
│   │   ├── humanize_test.go
│   │   └── package.go
│   ├── iotools.go
│   ├── iotools_test.go
│   ├── kv/
│   │   ├── keyvaluestore.go
│   │   └── keyvaluestore_test.go
│   ├── math.go
│   ├── math_test.go
│   ├── ordered_set.go
│   ├── ordered_set_test.go
│   ├── os_tools.go
│   ├── robustio.go
│   ├── robustio_windows.go
│   ├── str_tools.go
│   ├── str_tools_test.go
│   ├── stringset.go
│   ├── sync_writer.go
│   ├── time_tools.go
│   ├── time_tools_test.go
│   ├── umask_nix.go
│   ├── umask_windows.go
│   ├── util_darwin.go
│   ├── util_darwin_test.go
│   ├── util_generic.go
│   ├── util_linux.go
│   ├── util_test.go
│   ├── util_windows.go
│   └── util_windows_test.go
├── tq/
│   ├── adapterbase.go
│   ├── api.go
│   ├── api_test.go
│   ├── basic_download.go
│   ├── basic_upload.go
│   ├── custom.go
│   ├── custom_test.go
│   ├── errors.go
│   ├── errors_test.go
│   ├── manifest.go
│   ├── manifest_test.go
│   ├── meter.go
│   ├── schemas/
│   │   ├── http-batch-request-schema.json
│   │   └── http-batch-response-schema.json
│   ├── ssh.go
│   ├── transfer.go
│   ├── transfer_queue.go
│   ├── transfer_queue_test.go
│   ├── transfer_test.go
│   ├── tus_upload.go
│   ├── verify.go
│   └── verify_test.go
├── tr/
│   ├── tr.go
│   └── trgen/
│       └── trgen.go
└── versioninfo.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
* text=auto
* eol=lf
*.bat eol=crlf


================================================
FILE: .github/CODEOWNERS
================================================
*   @git-lfs/core


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**System environment**
The version of your operating system, plus any relevant information about platform or configuration (e.g., container or CI usage, Cygwin, WSL, or non-Basic authentication).  If relevant, include the output of `git config -l` as a code block.

Please also mention the usage of any proxy, including any TLS MITM device or non-default antivirus or firewall.

**Output of `git lfs env`**
The output of running `git lfs env` as a code block.

**Additional context**
Any other relevant context about the problem here.

If you're having problems trying to push or pull data, please run the command with `GIT_TRACE=1 GIT_TRANSFER_TRACE=1 GIT_CURL_VERBOSE=1` and include it inline or attach it as a text file.  In a bash or other POSIX shell, you can simply prepend this string and a space to the command.

<!--
Please note: if you're receiving a message from the server side (including a
`batch response` message), please contact your Git hosting provider.  This
repository is for the Git LFS client only; problems with GitHub's server-side
LFS support should be reported to them as described in the `CONTRIBUTING.md`
file.
-->


================================================
FILE: .github/ISSUE_TEMPLATE/other-issue.md
================================================
---
name: Other issue
about: Ask a question, request a feature, or report something that's not a bug
title: ''
labels: ''
assignees: ''

---

**Describe the issue**
A clear and concise description of why you wrote in today.

**System environment**
The version of your operating system, plus any relevant information about platform or configuration (e.g., container or CI usage, Cygwin, WSL, or non-Basic authentication).  If relevant, include the output of `git config -l` as a code block.

**Output of `git lfs env`**
The output of running `git lfs env` as a code block.

**Additional context**
Any other relevant context about the problem here.

<!--
Please note: if you're receiving a message from the server side (including a
`batch response` message), it's probably best to contact your Git hosting
provider about the problem.  Also, this repository is for the Git LFS client
only; problems with GitHub's server-side LFS support should be reported to them
as described in the `CONTRIBUTING.md` file.
-->


================================================
FILE: .github/dependabot.yml
================================================
---
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "monthly"


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on: [push, pull_request]
env:
  GOTOOLCHAIN: local

jobs:
  build-default:
    name: Build with default Git
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest]
        go: ['1.26.x']
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
        persist-credentials: false
        ref: ${{ github.ref }}
      # We specify the current ref because otherwise the checkout turns
      # annotated tags into lightweight ones, breaking "git describe".
      # See https://github.com/actions/checkout/issues/290 and
      # https://github.com/actions/checkout/issues/882 for details.
    - run: sudo gem install asciidoctor
    - uses: actions/setup-go@v6
      with:
        go-version: ${{ matrix.go }}
    - run: sudo apt-get update && sudo apt-get -y install gettext libarchive-tools
      if: ${{ startsWith(matrix.os, 'ubuntu-') }}
      env:
          DEBIAN_FRONTEND: noninteractive
    - run: script/cibuild
      env:
          FORCE_LOCALIZE: true
    - run: CGO_ENABLED=0 make release
      env:
          FORCE_LOCALIZE: true
    - run: mkdir -p bin/assets
    - run: find bin/releases -name "*$(uname -s | tr A-Z a-z)*" | xargs -I{} cp {} bin/assets
    - uses: actions/upload-artifact@v7
      with:
        name: ${{ matrix.os }}
        path: bin/assets
  build-go:
    name: Build with specific Go
    strategy:
      matrix:
        go: ['1.25.x']
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
        persist-credentials: false
        ref: ${{ github.ref }}
    - uses: actions/setup-go@v6
      with:
        go-version: ${{ matrix.go }}
    - run: script/cibuild
  build-windows:
    name: Build on Windows
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
        persist-credentials: false
        ref: ${{ github.ref }}
    - run: gem install asciidoctor
    - uses: actions/setup-go@v6
      with:
        go-version: '1.26.x'
    - run: mkdir -p "$HOME/go/bin"
      shell: bash
    - run: set GOPATH=%HOME%\go
    - run: choco install -y InnoSetup
    - run: make man
      shell: bash
    - run: GOPATH="$HOME/go" PATH="$HOME/go/bin:$PATH" go install github.com/josephspurrier/goversioninfo/cmd/goversioninfo@latest
      shell: bash
    - uses: git-for-windows/setup-git-for-windows-sdk@v1
      with:
        flavor: minimal
      # We install the SDK so as to have access to the msgfmt.exe binary
      # from the GNU gettext package.
    - run: GOPATH="$HOME/go" PATH="$HOME/go/bin:$PATH" script/cibuild
      shell: bash
    - run: rm -f commands/mancontent_gen.go
      shell: bash
    - run: GOPATH="$HOME/go" PATH="$HOME/go/bin:$PATH" make GOARCH=386 -B
      shell: bash
      env:
        FORCE_LOCALIZE: true
    - run: mv bin\git-lfs.exe git-lfs-x86.exe
    - run: rm -f commands/mancontent_gen.go
      shell: bash
    - run: GOPATH="$HOME/go" PATH="$HOME/go/bin:$PATH" make GOARCH=amd64 -B
      shell: bash
      env:
        FORCE_LOCALIZE: true
    - run: mv bin\git-lfs.exe git-lfs-x64.exe
    - run: rm -f commands/mancontent_gen.go
      shell: bash
    - run: GOPATH="$HOME/go" PATH="$HOME/go/bin:$PATH" make GOARCH=arm64 -B
      shell: bash
      env:
        FORCE_LOCALIZE: true
    - run: mv bin\git-lfs.exe git-lfs-arm64.exe
    - run: iscc script\windows-installer\inno-setup-git-lfs-installer.iss
    - run: mkdir -p bin/assets
      shell: bash
    - run: mv *.exe bin/assets
      shell: bash
    - uses: actions/upload-artifact@v7
      with:
        name: windows-latest
        path: bin/assets
  build-latest:
    name: Build with latest Git
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
        persist-credentials: false
        ref: ${{ github.ref }}
    - uses: actions/setup-go@v6
      with:
        go-version: '1.26.x'
    - run: git clone -b master https://github.com/git/git.git "$HOME/git"
    - run: |
        echo "GIT_INSTALL_DIR=$HOME/git" >> "$GITHUB_ENV"
        echo "$HOME/git/bin" >> "$GITHUB_PATH"
      if: ${{ matrix.os == 'macos-latest' }}
      # We install our custom Git version into a PATH location ahead of
      # that of the Git installed by Homebrew.
    - run: script/build-git "$HOME/git"
    - run: GIT_DEFAULT_HASH=sha256 script/cibuild
  build-earliest:
    name: Build with earliest Git
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
        persist-credentials: false
        ref: ${{ github.ref }}
    - uses: actions/setup-go@v6
      with:
        go-version: '1.26.x'
    - run: git clone -b v2.0.0 https://github.com/git/git.git "$HOME/git"
    - run: |
        echo "GIT_INSTALL_DIR=$HOME/git" >> "$GITHUB_ENV"
        echo "$HOME/git/bin" >> "$GITHUB_PATH"
      if: ${{ matrix.os == 'macos-latest' }}
      # We install our custom Git version into a PATH location ahead of
      # that of the Git installed by Homebrew.
    - run: script/build-git "$HOME/git"
    - run: script/cibuild
  build-docker:
    name: Build Linux packages
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
        persist-credentials: false
        ref: ${{ github.ref }}
    - run: git clone https://github.com/git-lfs/build-dockers.git "$HOME/build-dockers"
    - run: (cd "$HOME/build-dockers" && ./build_dockers.bsh)
    - run: ./docker/run_dockers.bsh --prune
  build-docker-arm:
    name: Build Linux ARM packages
    runs-on: ubuntu-24.04-arm
    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
        persist-credentials: false
        ref: ${{ github.ref }}
    - run: git clone https://github.com/git-lfs/build-dockers.git "$HOME/build-dockers"
    - run: (cd "$HOME/build-dockers" && ./build_dockers.bsh --arch=arm64 debian_11 debian_12)
    - run: ./docker/run_dockers.bsh --prune --arch=arm64 debian_11 debian_12


================================================
FILE: .github/workflows/release.yml
================================================
name: Release
on:
  push:
    tags: '*'
env:
  GOTOOLCHAIN: local

jobs:
  build-windows:
    name: Build Windows Assets
    environment: production
    runs-on: windows-latest
    strategy:
      matrix:
        go: ['1.26.x']
    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
        persist-credentials: false
        ref: ${{ github.ref }}
      # We specify the current ref because otherwise the checkout turns
      # annotated tags into lightweight ones, breaking "git describe".
      # See https://github.com/actions/checkout/issues/290 and
      # https://github.com/actions/checkout/issues/882 for details.
    - run: gem install asciidoctor
    - uses: actions/setup-go@v6
      with:
        go-version: ${{ matrix.go }}
    - run: mkdir -p "$HOME/go/bin"
      shell: bash
    - run: set GOPATH=%HOME%\go
    - run: choco install -y InnoSetup
    - run: choco install -y zip
    - run: choco install -y jq
    - run: GOPATH="$HOME/go" PATH="$HOME/go/bin:$PATH" go install github.com/josephspurrier/goversioninfo/cmd/goversioninfo@latest
      shell: bash
    - uses: git-for-windows/setup-git-for-windows-sdk@v1
      with:
        flavor: minimal
      # We install the SDK so as to have access to the msgfmt.exe binary
      # from the GNU gettext package.
    - run: mkdir -p bin/releases
      shell: bash
    - run: PATH="$HOME/go/bin:$PATH" GOARCH=amd64 go generate && make bin/releases/git-lfs-windows-amd64-$(git describe).zip
      shell: bash
      env:
        FORCE_LOCALIZE: true
    - run: PATH="$HOME/go/bin:$PATH" GOARCH=386 go generate && make bin/releases/git-lfs-windows-386-$(git describe).zip
      shell: bash
      env:
        FORCE_LOCALIZE: true
    - run: PATH="$HOME/go/bin:$PATH" GOARCH=arm64 go generate && make bin/releases/git-lfs-windows-arm64-$(git describe).zip
      shell: bash
      env:
        FORCE_LOCALIZE: true
    - run: make release-windows-stage-1
      shell: bash
      env:
        FORCE_LOCALIZE: true
    - uses: azure/trusted-signing-action@v1.1.0
      with:
        azure-tenant-id: ${{ secrets.SPN_GIT_LFS_SIGNING_TENANT_ID }}
        azure-client-id: ${{ secrets.SPN_GIT_LFS_SIGNING_CLIENT_ID }}
        azure-client-secret: ${{ secrets.SPN_GIT_LFS_SIGNING }}
        endpoint: https://wus.codesigning.azure.net/
        trusted-signing-account-name: GitHubInc
        certificate-profile-name: GitHubInc
        files-folder: ${{ github.workspace }}/tmp/stage1
        files-folder-filter: exe
        file-digest: SHA256
        timestamp-rfc3161: http://timestamp.acs.microsoft.com
        timestamp-digest: SHA256
    - run: make release-windows-stage-2
      shell: bash
    - uses: azure/trusted-signing-action@v1.1.0
      with:
        azure-tenant-id: ${{ secrets.SPN_GIT_LFS_SIGNING_TENANT_ID }}
        azure-client-id: ${{ secrets.SPN_GIT_LFS_SIGNING_CLIENT_ID }}
        azure-client-secret: ${{ secrets.SPN_GIT_LFS_SIGNING }}
        endpoint: https://wus.codesigning.azure.net/
        trusted-signing-account-name: GitHubInc
        certificate-profile-name: GitHubInc
        files-folder: ${{ github.workspace }}/tmp/stage2
        files-folder-filter: exe
        file-digest: SHA256
        timestamp-rfc3161: http://timestamp.acs.microsoft.com
        timestamp-digest: SHA256
    - run: make release-windows-stage-3
      shell: bash
    - run: make release-windows-rebuild
      shell: bash
    - uses: actions/upload-artifact@v7
      with:
        name: windows-assets
        path: bin/releases
  build-macos:
    name: Build macOS Assets
    environment: production
    runs-on: macos-latest
    strategy:
      matrix:
        go: ['1.26.x']
    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
        persist-credentials: false
        ref: ${{ github.ref }}
    - run: gem install asciidoctor
    - uses: actions/setup-go@v6
      with:
        go-version: ${{ matrix.go }}
    - run: make release
      env:
          FORCE_LOCALIZE: true
    - run: CERT_FILE="$HOME/cert.p12" make release-write-certificate
      env:
        CERT_CONTENTS: ${{secrets.GATEWATCHER_DEVELOPER_ID_CERT}}
    - run: CERT_FILE="$HOME/cert.p12" make release-import-certificate
      env:
        CERT_PASS: ${{secrets.GATEWATCHER_DEVELOPER_ID_PASSWORD}}
    - run: make release-darwin
      env:
        DARWIN_DEV_USER: ${{secrets.MACOS_DEV_USER}}
        DARWIN_DEV_PASS: ${{secrets.MACOS_DEV_PASS}}
        DARWIN_DEV_TEAM: ${{secrets.MACOS_DEV_TEAM}}
    - uses: actions/upload-artifact@v7
      with:
        name: macos-assets
        path: bin/releases
  build-main:
    name: Main Release Assets
    needs:
      - build-windows
      - build-macos
    runs-on: ubuntu-latest
    strategy:
      matrix:
        go: ['1.26.x']
    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
        persist-credentials: false
        ref: ${{ github.ref }}
    - run: sudo gem install asciidoctor
    - uses: actions/setup-go@v6
      with:
        go-version: ${{ matrix.go }}
    - run: sudo apt-get update && sudo apt-get -y install gettext libarchive-tools
      env:
          DEBIAN_FRONTEND: noninteractive
    - uses: actions/download-artifact@v8
      with:
        name: windows-assets
        path: windows-assets
    - uses: actions/download-artifact@v8
      with:
        name: macos-assets
        path: macos-assets
    - run: CGO_ENABLED=0 make release
    - run: rm -f bin/releases/*windows* bin/releases/*darwin*
    - run: 'find windows-assets -name "*windows*" -type f | xargs -I{} mv {} bin/releases'
    - run: 'find macos-assets -name "*darwin*" -type f | xargs -I{} mv {} bin/releases'
    - run: rm -f bin/releases/git-lfs-windows-assets*.tar.gz
    - run: mkdir -p release-assets/bin
    - run: mv bin/releases release-assets/bin
    - uses: actions/upload-artifact@v7
      with:
        name: release-assets
        path: release-assets
  build-docker:
    name: Build Linux Packages
    environment: production
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
        persist-credentials: false
        ref: ${{ github.ref }}
    - run: sudo gem install packagecloud-ruby
    - run: git clone https://github.com/git-lfs/build-dockers.git "$HOME/build-dockers"
    - run: (cd "$HOME/build-dockers" && ./build_dockers.bsh)
    - run: ./docker/run_dockers.bsh --prune
    # If this is a pre-release tag, don't upload anything to packagecloud.
    - run: '[ -z "${GITHUB_REF%%refs/tags/*-pre*}" ] || ./script/packagecloud.rb'
      env:
        PACKAGECLOUD_TOKEN: ${{secrets.PACKAGECLOUD_TOKEN}}
  build-docker-arm:
    name: Build Linux ARM packages
    runs-on: ubuntu-24.04-arm
    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
        persist-credentials: false
        ref: ${{ github.ref }}
    - run: sudo gem install packagecloud-ruby
    - run: git clone https://github.com/git-lfs/build-dockers.git "$HOME/build-dockers"
    - run: (cd "$HOME/build-dockers" && ./build_dockers.bsh --arch=arm64 debian_11 debian_12)
    - run: ./docker/run_dockers.bsh --prune --arch=arm64 debian_11 debian_12
    # If this is a pre-release tag, don't upload anything to packagecloud.
    - run: '[ -z "${GITHUB_REF%%refs/tags/*-pre*}" ] || ./script/packagecloud.rb'
      env:
        PACKAGECLOUD_TOKEN: ${{secrets.PACKAGECLOUD_TOKEN}}


================================================
FILE: .gitignore
================================================
bin/
benchmark/
out/
resource.syso

man/*

*.test
tmp
t/remote
t/scutiger
t/test_count
t/test_count.lock

debian/git-lfs/
debian/*.log
debian/files
debian/*.substvars
debian/debhelper-build-stamp
debian/.debhelper
/.pc
obj-*

rpm/BUILD*
rpm/*RPMS
rpm/*.log
rpm/SOURCES

repos
docker/*.key

src
commands/mancontent_gen.go

po/build
po/i-reverse.po
*.mo
*.pot
tr/tr_gen.go

lfstest-*
!lfstest-*.go

vendor/


================================================
FILE: .mailmap
================================================
Andy Neff <andyneff@users.noreply.github.com> <andrew.neff@visionsystemsinc.com>
Artem V. Navrotskiy <bozaro@yandex.ru> a.navrotskiy <navrotskiy@corp.mail.ru>
Artem V. Navrotskiy <bozaro@yandex.ru> <bozaro@users.noreply.github.com>
Brandon Keepers <bkeepers@github.com> <brandon@opensoul.org>
David Pursehouse <dpursehouse@collab.net> <david.pursehouse@gmail.com>
Evan Priestley <epriestley@javelinjs.com> <git@epriestley.com>
Josh Vera <josh@joshvera.com> <vera@github.com>
Lars Schneider <larsxschneider@gmail.com> <lars.schneider@autodesk.com>
Lee Reilly <lee@leereilly.net> <lee@github.com>
Noam Y. Tenne <noam@10ne.org> noamt <noam@10ne.org>
Rick Olson <technoweenie@gmail.com> rick <technoweenie@gmail.com>
Rick Olson <technoweenie@gmail.com> risk danger olson <technoweenie@gmail.com>
Rick Olson <technoweenie@gmail.com> Your Name <you@example.com>
Riku Lääkkölä <riku.laakkola@iki.fi> <riku.laakkola@coriant.com>
Ryan Simmen <ryan.simmen@gmail.com> <ryansim@microsoft.com>
Scott Barron <scott@barron.io> rubyist <scott.barron@github.com>
Scott Barron <scott@barron.io> Scott Barron <scott.barron@github.com>
Scott Richmond <s.t.richmond@gmail.com> <Scott Richmond>
Sebastian Schuberth <sschuberth@gmail.com> <sschuberth@users.noreply.github.com>
Taylor Blau <me@ttaylorr.com> <ttaylorr@github.com>
William Hipschman <willhi@microsoft.com> Will <willhi@microsoft.com>


================================================
FILE: .ruby-version
================================================
3.1.2


================================================
FILE: CHANGELOG.md
================================================
# Git LFS Changelog

## 3.7.0 (26 June 2025)

This release is a feature release which introduces several new options
for fetching Git LFS objects, such as the ability to force objects to
be re-downloaded and the capacity to output object URLs and HTTP
metadata in JSON for external tools to consume.  This release also adds
a configurable in-memory cache of file path pattern matches, which along
with other changes can help reduce the time required to migrate large
repositories to Git LFS.

Git LFS now supports the same `.netrc` files on Windows as Git and
curl, retries appropriately after all 429 status code HTTP responses,
permits the use of symbolic links to Git's object storage during
Git LFS migrations, and avoids spurious TLS verification errors when
custom CA certificates are configured on macOS.

Note that the v3.7.x series of Git LFS releases are the first for which
we provide packages and support for versions of Linux distributions
based on Red Hat Enterprise Linux (RHEL) 10, such as Rocky Linux 10.

Note also that beginning with this release, we no longer provide packages
or support for versions of any Linux distribution based on Debian 10
("buster"), RHEL/CentOS 7, or SUSE Linux Enterprise Server (SLES) 12.

This release is built using Go v1.24 and therefore on Linux systems
now requires Linux kernel version 3.2 or later.

We would like to extend a special thanks to the following open-source
contributors:

* @alexkad0 for improving the performance of our `migrate` command
* @alingse for making our code simpler and more readable
* @DarkDefender for refining the documentation of our `checkout` command
* @fedirz for tidying up the documentation of our `migrate` command
* @gergelyfabian for helping update our Go dependencies
* @johanvdw for enhancing our `.netrc` file support on Windows
* @Juneezee for updating our code to use new Go built-in functions
* @LucasDondo for revising our Linux installation instructions
* @m3ka24 for amending the documentation of our `prune` command
* @philip-peterson for correcting our HTTP error reporting
* @redsun82 for adding multiple new options to our `fetch` command
* @slonopotamus for fixing JSON examples in our API documentation
* @stanhu for addressing conflicts between custom CA certificates on macOS

### Features

* Cache a file path filter match result #6047 (@alexkad0)
* Add `--refetch` option to `fetch` #5975 (@redsun82)
* Add `--json` option to `fetch` #5974 (@redsun82)
* Add `--dry-run` option to `fetch` #5973 (@redsun82)

### Bugs

* Verify TLS/SSL certificates using default Go support for macOS system root CAs #6049 (@chrisd8088)
* Prefer .netrc on windows if present #6055 (@johanvdw)
* Fix migrations where `.git/objects` is a symlink #6042 (@bk2204)
* Honour 429 object transfer response `Retry-After` headers #6014 (@chrisd8088)

### Misc

* Update Linux distribution package list for v3.7.0 release (@chrisd8088)
* Report missing objects consistently when pushing #6027 (@chrisd8088)
* Use a git-update-ref script to update references #6048 (@alexkad0)
* Drop unused generic stub function for cloning files #6050 (@chrisd8088)
* Prevent conflicting curl macros in early Git version CI jobs #6040 (@chrisd8088)
* pull: improve error message on failing checkout #5629 (@bk2204)
* Fix language in code snippets in API docs #6035 (@slonopotamus)
* build(deps): bump golang.org/x/net from 0.36.0 to 0.38.0 #6034 (@dependabot[bot])
* Use single-target `Makefile` patterns for manual pages #6032 (@chrisd8088)
* use direct value nil for error #6024 (@alingse)
* Update minimum required Git version checks #6028 (@chrisd8088)
* build(deps): bump golang.org/x/net from 0.33.0 to 0.36.0 #6012 (@dependabot[bot])
* Upgrading x/crypto to v0.35.0 to solve CVE-2025-22869 #5997 (@gergelyfabian)
* Upgrade to Go 1.24 #6013 (@chrisd8088)
* Use constant format strings and fix HTTP error messages #5998 (@chrisd8088)
* Remove command name prefixes from progress messages #5995 (@chrisd8088)
* doc: Add missing "--to" argument in git-lfs-checkout example #6005 (@DarkDefender)
* Replace min/max helpers with built-in min/max #5999 (@Juneezee)
* Add security patch release process documentation #5987 (@chrisd8088)
* Replace unused debug mode with trace logging #5989 (@chrisd8088)
* Use default Ruby provided by Actions runners #5984 (@chrisd8088)
* build(deps): bump azure/trusted-signing-action from 0.5.0 to 0.5.1 #5981 (@dependabot[bot])
* Update workflows to use ARM runners and new Apple signing certificate #5977 (@chrisd8088)
* docs/man/git-lfs-prune.adoc: fix --(no-)verify-unreachable description #5959 (@m3ka24)
* docs/man/git-lfs-migrate.adoc: remove duplicate flag #5944 (@fedirz)
* Upgrade `golang.org/x/net` from 0.23.0 to 0.33.0 #5940 (@gergelyfabian)
* build(deps): bump golang.org/x/crypto from 0.21.0 to 0.31.0 #5935 (@dependabot[bot])
* Simplify macOS CI jobs and specify Go toolchain version #5931 (@chrisd8088)
* Tighten security of Actions workflows #5930 (@bk2204)
* Corrected Pop!\_OS naming #5929 (@LucasDondo)
* Update release process documentation and scripts #5920 (@chrisd8088)
* Update license copyright dates and minimum supported Git version #5921 (@chrisd8088)

## 3.6.0 (20 November 2024)

This release is a feature release which includes support for multi-stage
authentication with Git credential helpers (requires Git 2.46.0) and
relative worktree paths (requires Git 2.48.0), a new object transfer batch
size configuration option, better path handling when installing on Windows,
more POSIX-compliant hook scripts, and improved performance with sparse
checkouts, partial clones, and Git remotes with large numbers of tags.

Note that the 3.6.x series of Git LFS releases will be the last releases
for which we provide packages or support for versions of any Linux
distribution based on either Red Hat Enterprise Linux 7 (RHEL 7) or
SUSE Linux Enterprise Server 12 (SLES 12).

Note also that the 3.6.x series of Git LFS releases may be the last
releases for which we provide packages or support for versions of any
Linux distribution based on Debian 10 ("buster").

This release is built using Go v1.23 and therefore on macOS systems
requires macOS 11 (Big Sur) or later, and on Windows systems requires
at least Windows 10 or Windows Server 2016 (although Windows 8.1 may
suffice).

We would like to extend a special thanks to the following open-source
contributors:

* @blanet for fixing a crash bug when handling HTTP 429 responses
* @bogomolets-owl for implementing a batch size configuration option
* @ConcurrentCrab for preventing hung SSH transfer protocol connections
* @jochenhz for ensuring files with Unicode names are not accidentally pruned
* @pastelsky for optimizing performance of our pre-push hook
* @rustfix for correcting some code comments
* @rusttech for fixing an array size allocation bug
* @xdavidwu for improving the portability of our tests and hooks

### Features

* git: improve sparse checkout support #5796 (@bk2204)
* hook: fix newlines in command missing message #5886 (@xdavidwu)
* Add batch size config value and use it everywhere #5876 (@bogomolets-owl)
* Support relative paths to linked working trees #5898 (@chrisd8088)
* git-lfs: omit tags in ls-remote; optimize pre-push #5863 (@pastelsky)
* Support multistage authentication with a Git credential helper #5803 (@bk2204)
* Support arbitrary HTTP credential schemes for authentication #5779 (@bk2204)
* Optimize performance for scanning trees in partial clones #5699 (@bk2204)
* Use lower-case file extensions in Windows installer path checks #5688 (@chrisd8088)
* Match `PATH` case insensitively in Windows installer #5680 (@bk2204)

### Bugs

* Fix crash during pure SSH object transfer with multiple objects #5905 (@chrisd8088)
* ssh: fix connection creation "leaking" connections #5816 (@ConcurrentCrab)
* fix: fix slice init length #5874 (@rusttech)
* Fix panic caused by accessing non-existent header #5804 (@blanet)
* Avoid deadlocking on log scanning with lots of output on stderr #5738 (@bk2204)
* checkout: gracefully handle files deleted from the index #5698 (@bk2204)
* Fix logScanner fails to parse pointer file containing unicode chars #5655 (@jochenhz)

### Misc

* Fix improper negated test expressions and refine TLS client certificate tests #5914 (@chrisd8088)
* Always capture clone logs in tests and remove or update stale workarounds #5906 (@chrisd8088)
* Update Linux distribution package list for v3.6.0 release #5911 (@chrisd8088)
* doc: mention the pointer size constraint #5900 (@bk2204)
* Repair and restore all tests of cloning over TLS #5882 (@chrisd8088)
* t: increase portability #5887 (@xdavidwu)
* script/build-git: update Ubuntu 24.04 APT sources #5889 (@chrisd8088)
* Run tests in parallel on Windows and always cleanup test directories #5879 (@chrisd8088)
* Update release workflow to use Windows Trusted Signing Action #5873 (@chrisd8088)
* Upgrade to Go 1.23 #5872 (@chrisd8088)
* Use custom random data generator for all test objects and filenames #5868 (@chrisd8088)
* Always build Git against custom libcurl in CI workflows on macOS #5866 (@chrisd8088)
* Use expected version of Git on macOS in CI jobs #5813 (@chrisd8088)
* Move @bk2204 to alumni #5808 (@bk2204)
* docs/api: note API clients may send `charset` parameter in `Content-Type` header #5778 (@chrisd8088)
* issue template: add more information we'd want to see #5728 (@bk2204)
* .github/workflows: use actions/setup-go everywhere #5729 (@bk2204)
* build(deps): bump golang.org/x/net from 0.17.0 to 0.23.0 #5718 (@dependabot[bot])
* chore: fix function names in comment #5709 (@rustfix)
* Include remote error when pure SSH protocol fails #5674 (@bk2204)
* Build release assets with 1.22 #5673 (@bk2204)
* Build release assets with Go 1.21 #5668 (@bk2204)
* script/packagecloud: instantiate distro map properly #5662 (@bk2204)
* Install msgfmt on Windows in CI and release workflows #5666 (@chrisd8088)

## 3.5.0 (28 February 2024)

This release is a feature release which includes support for LoongArch and
RISC-V Linux binary tarballs, `FETCH_HEAD` as a remote source (from a plain
`git fetch`), better support for detection of the system gitattributes file,
and configuration options for the SSH protocol.  In this release, the
`FETCH_HEAD` support is experimental and subject to change.

We would like to extend a special thanks to the following open-source
contributors:

* @jochenhz for improvements to `git lfs prune`
* @murez for improvements to our installation script
* @qiangxuhui for tooling to build 64-bit LoongArch packages
* @AaronDewes for tooling to build 64-bit RISC-V packages
* @b-camacho for allowing `FETCH_HEAD` as a fallback remote source
* @tigsikram for fixing some broken links
* @aymanbagabas for fixing our SSH protocol documentation
* @KyleFromKitware for improvements to the pure SSH protocol
* @Juneezee for several code cleanups
* @cmaves for improving performance of our progress indications
* @QuLogic for improving completions and updating docs
* @philip-peterson for helping detect invalid refs in `git lfs push`
* @bogomolets-owl for helping include the reference specified in unlock requests

### Features

* Add --verify-unreachable option to LFS prune #5648 (@jochenhz)
* attribute: warn if config exists after uninstalling #5635 (@bk2204)
* Initialize sessions lazily #5634 (@bk2204)
* Add a `--local` argument to install.sh #5618 (@murez)
* Provide loong64 Binary Support #5607 (@qiangxuhui)
* Improve locking performance #5561 (@bk2204)
* Allow configuring the SSH protocol #5555 (@bk2204)
* Add `FETCH_HEAD` as fallback remote source #5357 (@b-camacho)
* Use `git var` to find system gitattributes file #5412 (@bk2204)
* Add RISC-V support #5438 (@AaronDewes)

### Bugs

* Add support for homedir expansion in SSL key and cert paths #5657 (@bk2204)
* Display correct status information when `git lfs ls-files` run in subdirectory #5653 (@chrisd8088)
* Fix git lfs prune is deleting staged files in the index #5637 (@jochenhz)
* Report invalid ref in `git lfs push` command #5639 (@chrisd8088)
* Always close open files when cloning and spooling #5617 (@chrisd8088)
* Fix git-scm.com links #5589 (@tigsikram)
* doc: update ssh_adapter.md #5560 (@aymanbagabas)
* track: don't modify `.gitattributes` with `--dry-run` #5559 (@bk2204)
* Update project home page URL in Linux builds and remove unused spec files #5551 (@chrisd8088)
* Retrieve endpoint URL only once when checking standalone transfer adapter configurations #5550 (@chrisd8088)
* ssh: Specifically designate a master multiplex connection #5537 (@KyleFromKitware)
* Include reference specifier in unlock requests #5538 (@chrisd8088)
* tq/transfer: copy Id and Token #5534 (@KyleFromKitware)
* Mock time in copy callback log file test #5524 (@chrisd8088)
* track: reject attempts to modify `.gitattributes` #5515 (@bk2204)
* Fix a panic in the credential code #5490 (@bk2204)
* Avoid modifying the mtime of empty files #5491 (@bk2204)
* Make track handle backslashes correctly on Unix #5482 (@bk2204)
* Print an error when pushing with no refs #5437 (@bk2204)

### Misc

* workflows: update to Go 1.22 #5650 (@bk2204)
* Distro updates for v3.5 #5647 (@bk2204)
* Use Azure Code Signing for Windows release binaries #5630 (@bk2204)
* Fix flaky test `t-credentials.sh` #5616 (@bk2204)
* t: pipe random data to `base64(1)` to be compatible with macOS #5614 (@chrisd8088)
* Replace deprecated `io/ioutil` functions #5595 (@Juneezee)
* t/t-path.sh: avoid flaky test setup failure on Windows due to new Go path security checks #5611 (@chrisd8088)
* build(deps): bump golang.org/x/crypto from 0.14.0 to 0.17.0 #5591 (@dependabot[bot])
* Update release documentation and changelog summary script for patch releases #5590 (@chrisd8088)
* Update notarization to use `notarytool` #5554 (@bk2204)
* lfs: avoid unnecessary byte/string conversion #5552 (@Juneezee)
* build(deps): bump golang.org/x/net from 0.7.0 to 0.17.0 #5541 (@dependabot[bot])
* Limit CopyCallbackFile to print every 200 ms #5504 (@cmaves)
* Update to Go 1.21 #5487 (@chrisd8088)
* Add installation note about restarting shells on Windows for PATH changes #5507 (@chrisd8088)
* Remove unused Docker scripts and update README #5506 (@chrisd8088)
* Remove old and unused release script #5500 (@chrisd8088)
* Update and expand documentation of the Git LFS release process #5452 (@chrisd8088)
* Update cobra to 1.7.0 #5444 (@QuLogic)
* Add FAQ entries for TLS data #5446 (@bk2204)
* Remove vendoring instructions from contributing docs #5443 (@QuLogic)
* FAQ: add an entry about proxies #5445 (@bk2204)
* tq/transfer_test.go: enable and fix all tests #5442 (@chrisd8088)
* Add a single source of truth for distro info #5439 (@bk2204)

## 3.4.0 (26 July 2023)

This release is a feature release which includes support for generating
shell scripts for command-line tab-completion of Git LFS commands with
the new `git-lfs-completion(1)` command, providing multiple headers to Git
credential helpers (a new feature as of Git 2.41), and installing Git LFS
with a Git configuration file stored under the XDG configuration path.

Note that this release will be made by a different member of the core
team than the person who performed many of the past releases, and thus
this release will be signed with a different OpenPGP key.  Please follow
[the steps in the README to download all of the keys for the core
team](https://github.com/git-lfs/git-lfs#verifying-releases) to verify
this release.

We would like to extend a special thanks to the following open-source
contributors:

* @anihm136 for implementing shell completion script generation
* @aymanbagabas for multiple fixes to our SSH and transfer queue code
* @dscho for ensuring our Windows installer works on 32-bit systems
* @dyrone for correcting an erroneous file name in our documentation
* @jlosito for making sure our CI job actions are up to date
* @nfgferreira for speeding up the track command on Windows
* @ry167 for improving our Ubuntu installation instructions
* @salvorizza for fixing a JSON bug in our unlock command
* @slonopotamus for cleaning up accommodations for legacy Go versions
* @steffen for improving our installation documentation

### Features

* Add support for `wwwauth[]` to credential helpers #5381 (@bk2204)
* Add a `--file` option to install and uninstall #5355 (@bk2204)
* Add shell completion generation #5311 (@anihm136)

### Bugs

* Handle local paths with trailing slashes #5402 (@bk2204)
* Unlock by ID with JSON Flag returns empty array #5385 (@salvorizza)
* Refactor macro attribute handling to prevent crashes with `--fixup` migration option #5382 (@chrisd8088)
* locks: print warning about locking API to standard error #5350 (@bk2204)
* Avoid needlessly spawning SSH connections with `git archive` #5309 (@bk2204)
* standalone: print an error if the destination isn't a Git repository #5283 (@bk2204)
* locks: ensure local locks are synced on error #5284 (@bk2204)
* installer: let it work on 32-bit Windows again #5266 (@dscho)
* fix(ssh): use /tmp to place control dir on darwin #5223 (@aymanbagabas)
* commands: avoid remote connections in checkout #5226 (@bk2204)
* fix(tq): stop adding transfers to queue after abort #5230 (@aymanbagabas)
* fix: pure SSH list lock command name #5219 (@aymanbagabas)
* git: match patterns, not file names, for tracked files #5423 (@bk2204)
* Resolve git-lfs track slowness on Windows due to unneeded user lookup #5431 (@nfgferreira)

### Misc

* Update distributions #5392 (@bk2204)
* workflows: remove refreshenv #5393 (@bk2204)
* Refactor `GitScanner` and simplify implementation #5389 (@chrisd8088)
* Ensure all logging tasks are closed and simplify log task dispatching #5375 (@chrisd8088)
* FAQ: add entry on archiving subdirectories #5349 (@bk2204)
* Drop pre-1.13 Go compatibility code #5364 (@slonopotamus)
* Fix CI by enabling Git protocol v2 #5353 (@bk2204)
* Clarify `git lfs migrate` handling of local and remote references #5327 (@chrisd8088)
* Update to Go version 1.20 #5326 (@chrisd8088)
* Remove stale video link #5325 (@chrisd8088)
* Fix Windows CI with Go 1.20 #5317 (@bk2204)
* Update Windows signing certificate hash #5300 (@chrisd8088)
* t: avoid incorrect negated commands #5282 (@bk2204)
* Update golang.org/x/text #5290 (@bk2204)
* Improve error handling for pure SSH protocol #5063 (@bk2204)
* workflow: use `choco install` #5281 (@bk2204)
* Update Linux releases in Packagecloud publication script #5276 (@chrisd8088)
* Simplify and deduplicate installation instructions #5260 (@steffen)
* Make hooks refer to `core.hookspath` #5245 (@bk2204)
* Update INSTALLING.md to fix ubuntu derivative command and allow easy install for some distros #5014 (@ry167)
* Check for github action updates monthly #5228 (@jlosito)
* Upgrade workflows to latest Ubuntu and Actions versions #5243 (@chrisd8088)
* Upgrade GitHub Actions workflows to use `ruby/setup-ruby@v1` #5236 (@chrisd8088)
* Add `git lfs migrate export` command examples to manual page #5239 (@chrisd8088)
* Unset `GIT_TRACE` environment variable for Git commands in `Makefile` #5240 (@chrisd8088)
* Clean up RPM builds and fix i686 RPM file names #5241 (@chrisd8088)
* Add a FAQ entry on Jenkins problems #5177 (@bk2204)
* Fix missing parameter in git lfs logs manual page #5414 (@chrisd8088)
* proposals: fix filename typo #5425 (@dyrone)
* Update shell tab-completion script support and add manual page #5429 (@chrisd8088)

## 3.3.0 (30 November 2022)

This release is a feature release which includes package support for Red Hat
Enterprise Linux 9 and compatible OSes, experimental support for multiple
remotes, and some command-line helpers for `git lfs push`.

In this release, we no longer include vendored versions of our dependencies in
the repository or the tarballs.  These were a source of noise and bloat, and
users can easily download the required dependencies with Go itself.  Users who
need to continue to vendor the dependencies can use the `make vendor` target.

In addition, we've also switched the documentation to AsciiDoc from
ronn-flavoured Markdown and included the FAQ in the repository.  This means that
the manual pages now render properly in the GitHub web interface and it's also
much easier to create additional formats, such as PDF, by leveraging the ability
of Asciidoctor to convert to DocBook.

It should also be noted that `git lfs migrate import --everything` now processes
all refs that aren't special to Git instead of just branches and tags.  This is
what it was documented to do, but didn't, so we've fixed it.

Finally, please note that future releases may be done by a different member of
the core team than many of the past releases, and thus may be signed by a
different OpenPGP key.  Please follow [the steps in the README to download all
of the keys for the core
team](https://github.com/git-lfs/git-lfs#verifying-releases) to verify releases
successfully in the future.

We would like to extend a special thanks to the following open-source
contributors:

* @dhiwakarK for fixing a broken link
* @dscho for improving our installer
* @Leo1690 for speeding things up with sparse checkout
* @pratap043 for proposing an extension to locking
* @rcoup for fixing our Makefile and adding scripting features to `git lfs push`
* @srohmen for adding support for alternative remotes
* @WhatTheFuzz for improving our error messages
* @wuhaochen for fixing a long-standing bug with `git lfs migrate import`

### Features

* Add the FAQ in the repository #5167 (@bk2204)
* Add support for Rocky Linux 9 #5144 (@bk2204)
* push: add ability to read refs/oids from stdin #5086 (@rcoup)
* Allow alternative remotes to be handled by LFS #5066 (@srohmen)
* Switch documentation to AsciiDoc #5054 (@bk2204)

### Bugs

* Handle macro attribute references with unspecified flag #5168 (@chrisd8088)
* Fixed broken link for git-lfs-migrate #5153 (@dhiwakarK)
* ssh: disable concurrent transfers if no multiplexing #5136 (@bk2204)
* Fix setting commit & vendor variables via make #5141 (@rcoup)
* ssh: don't leak resources when falling back to legacy protocol #5137 (@bk2204)
* Bump gitobj to v2.1.1 #5130 (@bk2204)
* tools: don't match MINGW as Cygwin #5106 (@bk2204)
* installer: handle `BashOnly` Git for Windows gracefully #5048 (@dscho)
* Change git-lfs migrate import --everything to migrate everything except for special git refs #5045 (@wuhaochen)

### Misc

* Use --sparse parameter for ls-files for performance optimization #5187 (@Leo1690)
* Add information to ambiguous error message. #5172 (@WhatTheFuzz)
* Distro update for v3.3.0 #5169 (@bk2204)
* docs/man: clarify Git LFS setup instructions #5166 (@larsxschneider)
* Update more stale comments relating to object scanning #5164 (@chrisd8088)
* Update stale comments relating to object scanning and uploading #5163 (@chrisd8088)
* script/cibuild: exclude icons from whitespace check #5142 (@bk2204)
* Update to Go version 1.19 #5126 (@chrisd8088)
* Drop vendoring #4903 (@bk2204)
* Adding locking_notes.md #5079 (@pratap043)
* t: set init.defaultBranch #5082 (@bk2204)
* go.mod: require gopkg.in/yaml.v3 v3.0.1 #5033 (@bk2204)
* script/upload: improve readability of asset verification #5032 (@bk2204)

## 3.2.0 (25 May 2022)

This release is a feature release which includes support for machine-readable
formats for a couple more commands, plus the ability to automatically merge
LFS-based text files from the command-line.  It's likely that the merge driver
will see future improvements, but if you have feedback on the design, please use
the discussions feature.

Note that our binary release archives no longer unpack into the current
directory, and now contain a top-level directory just like the source archives
do.

We would like to extend a special thanks to the following open-source
contributors:

* @bbodenmiller for fixing the formatting in our manual pages
* @breyed for fixing a typo in our manual pages
* @btoll for improving our README
* @rcoup for fixing our Accept header syntax
* @vtbassmatt for documenting our deprecation of NTLM

### Features

* ls-files: add a --json option #5007 (@bk2204)
* Add --json output for git lfs track #5006 (@bk2204)
* Add a merge driver #4970 (@bk2204)
* lfs: don't write hooks when they haven't changed #4935 (@bk2204)
* Tarballs, not tarbombs #4980 (@bk2204)

### Bugs

* Apply several Makefile fixes for Windows #5016 (@bk2204)
* git: don't panic on pkt-line without equals #4982 (@bk2204)
* lfshttp: fix invalid Accept header syntax #4996 (@rcoup)
* Grammar fix #4981 (@breyed)
* Use `gitignore`-style path matching for additional commands #4951 (@chrisd8088)
* Avoid pruning when identical files both match and do not match `lfs.fetchexclude` #4973 (@chrisd8088)
* Apply `lfs.fetchexclude` filter to previous commits when pruning #4968 (@chrisd8088)
* Update and correct several error message strings #4943 (@chrisd8088)
* script/upload: correct RHEL 8 package repo #4936 (@bk2204)
* lfs: add old hook content to the list of old hooks #4878 (@bk2204)
* .github/workflows: install packagecloud gem #4873 (@bk2204)

### Misc

* Update distros for packagecloud.io #5010 (@bk2204)
* lfshttp: log the Negotiate error on failure #5000 (@bk2204)
* Build CI on Windows 2022 #4997 (@chrisd8088)
* workflows: use ronn-ng #4992 (@bk2204)
* Multiple hash support #4971 (@bk2204)
* note deprecation of NTLM #4987 (@vtbassmatt)
* Update to Go 1.18, drop older Go version support, and update modules and dependencies #4963 (@chrisd8088)
* Update tests to check `prune` command excludes `lfs.fetchexclude` paths #4964 (@chrisd8088)
* Add test to check `prune` command retains tagged unpushed objects #4962 (@chrisd8088)
* Adjust test helpers and tests related to path filtering #4960 (@chrisd8088)
* Include shell path in restricted `PATH` in credential helper path test #4959 (@chrisd8088)
* Build test helper commands with `.exe` file extension on Windows #4954 (@chrisd8088)
* Update Windows signing certificate SHA hash in `Makefile` #4946 (@chrisd8088)
* remove unused `Pipe[Media]Command()` functions #4942 (@chrisd8088)
* Makefile: remove legacy trimpath code #4938 (@bk2204)
* add Inno Setup check of Git install paths and remove old uninstaller checks #4925 (@chrisd8088)
* note `git lfs push --all` only pushes local refs in man page #4898 (@chrisd8088)
* Build man pages into per-section subdirectories #4890 (@chrisd8088)
* Call out destructive command in README #4880 (@btoll)
* Improve formatting #4863 (@bbodenmiller)
* docs/howto: remind core team member to check Actions workflows #4868 (@bk2204)
* .github: fix syntax error in release workflow #4866 (@bk2204)

## 3.1.4 (19 Apr 2022)

This release is a bugfix release to fix some problems during the build of
v3.1.3.  There are otherwise no substantial changes from v3.1.3.

### Misc

* Use only Windows Server 2019 runners for CI in GitHub Actions #4883 (@chrisd8088)
* remove unused `Pipe[Media]Command()` functions #4942 (@chrisd8088)

## 3.1.3 (19 Apr 2022)

This release introduces a security fix for Windows systems, which has been
assigned CVE-2022-24826.

On Windows, if Git LFS operates on a malicious repository with a `..exe` file as
well as a file named `git.exe`, and `git.exe` is not found in PATH, the `..exe`
program will be executed, permitting the attacker to execute arbitrary code.
Similarly, if the malicious repository contains files named `..exe` and
`cygpath.exe`, and `cygpath.exe` is not found in PATH, the `..exe` program will
be executed when certain Git LFS commands are run.

This security problem does not affect Unix systems.  This is the same issue as
CVE-2020-27955 and CVE-2021-21237, but the fix for those issue was incomplete
and certain options can still cause the problem to occur.

This occurs because on Windows, Go includes (and prefers) the current directory
when the name of a command run does not contain a directory separator, and it
continues to search for programs even when the specified program name is empty.
This has been solved by failing if the path is empty or not found.

We would like to extend a special thanks to the following open-source
contributors:

* @yuske for reporting this to us responsibly

### Bugs

* Report errors when finding executables and revise PATH search tests (@chrisd8088)

### Misc

* Update Windows signing certificate SHA hash in Makefile (@chrisd8088)

## 3.1.2 (16 Feb 2022)

This is a bugfix release which fixes a bug in `git lfs install` and some issues
in our CI release processes, including one that prevented arm64 packages for
Debian 11 from being uploaded.

### Bugs

* lfs: add old hook content to the list of old hooks #4878 (@bk2204)

### Misc

* Revert "Merge pull request #4795 from bk2204/actions-checkout-v2" #4877 (@bk2204)
* .github/workflows: install packagecloud gem #4873 (@bk2204)

## 3.1.1 (14 Feb 2022)

This is a bugfix release which fixes a syntax error in the release workflow.

### Misc

* .github: fix syntax error in release workflow #4866 (@bk2204)

## 3.1.0 (14 Feb 2022)

This release is a feature release which includes support for fallback from
Negotiate to Basic authentication, new ARM64 packages for Debian 11, a new
localization infrastructure, and improved netrc support, in addition to various
bug fixes.  In addition, we've addressed a performance regression for `git lfs
migrate import` that was introduced in v3.0.2.

At the moment, there are no translations available, but if you are interested in
contributing to one, please reach out in an issue.  For compatibility with
Windows and to retain the ability to have a single relocatable binary, the
translations are included in the binary at build time.

We would like to extend a special thanks to the following open source
contributors:

* @donno2048 for improving our error checking
* @howardlyliao for improved netrc support
* @HermannDppes for improving our large file warning on Windows
* @rex4539 for fixing various typos throughout our codebase

### Features

* Fall back from Negotiate to Basic #4815 (@bk2204)
* Add basic support for localization #4729 (@bk2204)
* Add support for ARM64 Debian packages #4728 (@bk2204)
* netrc: consider same machine may have different login names #4726 (@howardlyliao)

### Bugs

* smudge: honor GIT_LFS_SKIP_SMUDGE with checkout-index #4860 (@bk2204)
* fix `git lfs fsck --objects A..B` handling and drop all left/right ref terminology #4859 (@chrisd8088)
* halt migration when `.gitattributes` symbolic link encountered #4849 (@chrisd8088)
* fix merging of `.gitattributes` with execute file mode during migration #4835 (@chrisd8088)
* Fix migrate import speed regression #4813 (@bk2204)
* Fix typos #4806 (@rex4539)
* Move `err` checking to before the value was used #4776 (@donno2048)
* migrate import: don't allow path filters with --above #4771 (@bk2204)
* avoid panic on checkout with `--to` but no path, and update checkout manual #4766 (@chrisd8088)
* creds: gracefully handle lack of askpass helper #4759 (@bk2204)
* post-checkout: don't modify permissions of untracked files #4760 (@bk2204)
* use gitattributes filepath matching for migrate filter options #4758 (@chrisd8088)
* Avoid errors in git lfs env #4713 (@bk2204)
* fs: specify a file as existing if it's empty #4654 (@bk2204)
* Fix bound for largefilewarning #4633 (@HermannDppes)

### Misc

* build missing man pages and correct HTML renderings #4851 (@chrisd8088)
* Update and mark message strings for translation #4846 (@chrisd8088)
* Mark almost all strings for translation #4781 (@bk2204)
* .github/workflows: switch to actions/checkout@v2 #4795 (@bk2204)
* script/packagecloud: update for latest distros #4794 (@bk2204)
* filter-process: don't print large file warning on fixed versions #4768 (@bk2204)
* ssh: avoid using -- where possible #4741 (@bk2204)
* vendor,go.*: update x/crypto and dependencies #4738 (@chrisd8088)
* Stop supporting Go older than 1.13 #4641 (@bk2204)

## 3.0.2 (28 Oct 2021)

This release is a bugfix release which fixes a variety of problems seen since
3.0.0, including problems with empty files, `git lfs fsck --pointers`, and
the testsuite.

We would like to extend a special thanks to the following open-source
contributors:

* @fh1ch for patches to make things work better on Alpine Linux
* @pyckle for fixing our handling of filenames in `git lfs migrate import`
* @ycongal-smile for fixing `git lfs migrate import` with similarly named files

### Bugs

* Fix two types of misdetection in git lfs fsck #4697 (@bk2204)
* lfs: don't flag non-LFS files as invalid pointers #4691 (@bk2204)
* git: honor GIT_OBJECT_DIRECTORY #4686 (@bk2204)
* migrate: properly escape blob filenames #4683 (@pyckle)
* ls-files: don't process empty files as pointers #4681 (@bk2204)
* Call migrate() BlobFn on every blob #4671 (@ycongal-smile)
* Correct t-lock regular expression to be musl compatible #4673 (@fh1ch)

### Misc

* Allow git-lfs-transfer integration tests to be skipped #4677 (@fh1ch)
* Make CI environment GIT prefix grep more specific #4678 (@fh1ch)

## 3.0.1 (28 Sep 2021)

This release is a bugfix release which fixes the Windows ARM64 build process and
addresses a regression in support for empty files in pull and fetch.

We would like to extend a special thanks to the following open-source
contributors:

* @dennisameling for fixing support for Windows on ARM64

### Bugs

* Fix Windows arm64 release #4647 (@dennisameling)
* fs: specify a file as existing if it's empty #4654 (@bk2204)

## 3.0.0 (24 Sep 2021)

This release is a major new release and introduces several new features, such as
a pure SSH-based protocol, packages for several new OS versions, support for
ARM64 Windows, Git-compatible pattern matching, and locking multiple files on
the command line, among other items.

When connecting over SSH, the first attempt will be made to use
`git-lfs-transfer`, the pure SSH protocol, and if it fails, Git LFS will fall
back to the hybrid protocol using `git-lfs-authenticate`.  Note that no major
forges are known to support the pure SSH protocol at this time.

Because it is a major release, we've made some backwards-incompatible changes.
A (possibly incomplete) list of them is as follows:

* NTLM support has been completely removed, since nobody volunteered to fix
  issues in it.  Users are advised to use Kerberos or Basic authentication
  instead.
* When using an SSH URL (that is, the syntax starting with `ssh://`), the
  leading slash is not stripped off when invoking `git-lfs-authenticate` or
  `git-lfs-transfer`.  This is compatible with the behavior of Git when invoking
  commands over SSH.
* `git lfs fsck` now additionally checks that pointers are canonical and that
  files that are supposed to be LFS files actually are.  It also exits nonzero
  if any problem is found.
* Pattern matching should be stricter and should either match the behavior of
  `.gitattributes` or `.gitignore`, as appropriate.  Deviations from Git's
  behavior will henceforth be treated as bugs and fixed accordingly.
* Git LFS will now write a Git LFS repository format version into the
  repository.  This is designed to allow future extension with incompatible
  changes.  Repositories without this version will be assumed to be version 0.
  Note that this is different from, but modeled on, Git's repository format
  version.
* `git lfs lock` and `git lfs unlock` now handle multiple pathname arguments and
  the JSON format has changed to handle multiple responses.
* The Go package name now contains a version number.  This should have no effect
  on users because we don't provide a stable Go ABI.
* Empty components in `PATH` are no longer treated as the current directory on
  Windows because unintentionally having such empty components is common and the
  behavior was surprising.

We would like to extend a special thanks to the following open-source
contributors:

* @codykrieger for ensuring that we process includes correctly
* @corngood for fixing a hang in prune
* @dennisameling for adding support for Windows on ARM64
* @fh1ch for fixing our 429 handling
* @geki-yaba for fixing problems with askpass on Cygwin
* @gison93 for fixing a bug in our documentation
* @jvimr for ensuring our Debian packages are built properly
* @opohorel for ensuring our copyright notices were up to date
* @rhansen for fixing systems where / is a repository
* @sergiou87 for improving support for cross builds
* @slonopotamus for improving our error handling
* @stanhu for improving our handling of invalid OIDs
* @Timmmm for improving our support of .lfsconfig
* @tklauser for avoiding the need for cgo on macOS

### Features

* Advertise hash algorithm supported in batch request #4624 (@bk2204)
* Bump package version to v3 #4611 (@bk2204)
* Update OS versions #4610 (@bk2204)
* Add support for Debian 11 #4592 (@bk2204)
* Support for locking and unlocking multiple files #4604 (@bk2204)
* Add support for Windows ARM64 #4586 (@dennisameling)
* LFS repository format version #4552 (@bk2204)
* Pure SSH-based protocol #4446 (@bk2204)
* Make fsck able to check for invalid pointers #4525 (@bk2204)
* Add --fixup option to migrate info command #4501 (@chrisd8088)
* Allow reporting of LFS pointers separately in migrate info command #4436 (@chrisd8088)
* Add config variables for default remotes #4469 (@bk2204)
* Make lfshttp package builds more portable #4476 (@bk2204)
* Mark skipdownloaderrors as safe #4468 (@Timmmm)
* Make migrate commands default to preserving uncommitted changes #4454 (@chrisd8088)
* Darwin ARM64 support #4437 (@bk2204)
* tools: implement cloneFileSyscall on darwin without cgo #4387 (@tklauser)
* prune: add options to be more aggressive about pruning #4368 (@bk2204)

### Bugs

* corrected debian 11 & 12 derived variants #4622 (@jvimr)
* urlconfig: anchor regexp for key matching #4598 (@bk2204)
* filepathfilter: always use Git-compatible pattern matching #4556 (@bk2204)
* debian and rpm: Pass `--skip-repo` to `install` and `uninstall` #4594 (@rhansen)
* Fix hang in prune #4557 (@corngood)
* Disable ANSI color codes while log parsing and anchor diff regular expressions #4585 (@chrisd8088)
* Fix 429 retry-after handling for LFS batch API endpoint #4573 (@fh1ch)
* go.mod: bump gitobj to v2.0.2 #4555 (@bk2204)
* Fix locking with multiple paths and absolute paths #4535 (@bk2204)
* locking: avoid nil pointer dereference with invalid response #4509 (@bk2204)
* migrate import: make --above affect only individual files #4512 (@bk2204)
* fs: be a little less aggressive with cleanup #4490 (@bk2204)
* Fix downloadFile in gitfilter_smudge.go to actually propagate all errors #4478 (@slonopotamus)
* Translate Cygwin path patches for askpass helper and cert dir/file #4473 (@geki-yaba)
* Avoid panic on SIGINT by skipping cleanup when config uninitialized #4463 (@chrisd8088)
* Parse stash log entries parsimonously in prune command #4449 (@chrisd8088)
* docs: note that -I and -X override configuration settings #4442 (@bk2204)
* Make all checks of blobSizeCutoff consistent #4435 (@chrisd8088)
* Fix up handling of the "migrate info" command's --top option #4434 (@chrisd8088)
* Tighten LFS pointer regexp #4421 (@stanhu)
* invoke git-config with --includes to ensure it always evaluates `include.*` directives #4420 (@codykrieger)
* Canonicalize Windows paths like Git does #4418 (@bk2204)
* lfsapi: don't warn about duplicate but identical aliases #4413 (@bk2204)
* lfs: don't invoke diff drivers when pruning repositories #4407 (@bk2204)
* Consider scheme of request URL, not proxy URL, when choosing proxy #4396 (@bk2204)
* Makefile: allow make release to be run twice in a row #4344 (@bk2204)
* Makefile: don't fail the second time macOS builds are built #4341 (@bk2204)

### Misc

* subprocess: don't treat empty PATH component as . on Windows #4603 (@bk2204)
* Switch from which to command -v #4591 (@bk2204)
* Bump Go to 1.17 #4584 (@dennisameling)
* Add cautions about unstable Go API and fix GPG key link #4582 (@chrisd8088)
* Update go.mod module path with explicit v2 #4575 (@chrisd8088)
* Drop unused ClearTempStorage() transfer adapter method and tune stale comments #4554 (@chrisd8088)
* README: improve steps for building from source #4527 (@bk2204)
* Update license year #4513 (@opohorel)
* docs/man: add note re post-import use of checkout #4504 (@chrisd8088)
* Bump transitive dependencies #4502 (@bk2204)
* script/packagecloud: update distros #4494 (@bk2204)
* Use host architecture and OS when running `go generate` #4492 (@sergiou87)
* Bump go-spnego to the latest version #4482 (@bk2204)
* Update git-lfs-migrate man page and add description section #4458 (@chrisd8088)
* update x/text and dependencies #4455 (@opohorel)
* Use blobSizeCutoff in clean pointer buffer length check #4433 (@chrisd8088)
* tools: unset XDG_CONFIG_HOME for filetools test #4432 (@chrisd8088)
* vendor,go.{mod,sum}: update x/net and dependencies #4398 (@chrisd8088)
* Remove NTLM #4384 (@bk2204)
* gitobj 2.0.1 #4348 (@bk2204)
* Fix numbered list in git lfs examples #4347 (@gison93)
* Add test for download gzip transport compression #4345 (@bk2204)

## 2.13.3 (26 Mar 2021)

This release fixes two bugs that caused `git lfs prune` to hang, updates some
dependencies to versions which lack a security issue (which did not affect Git
LFS), and adds support for ARM64 builds on macOS.

### Bugs

* lfs: don't invoke diff drivers when pruning repositories #4407 (@bk2204)
* Parse stash log entries parsimonously in prune command #4449 (@chrisd8088)

### Misc

* Darwin ARM64 support #4437 (@bk2204)
* vendor,go.{mod,sum}: update x/net and dependencies #4398 (@chrisd8088)

## 2.13.2 (13 Jan 2021)

This release introduces a security fix for Windows systems, which has been
assigned CVE-2021-21237.

On Windows, if Git LFS operates on a malicious repository with a git.bat or
git.exe file in the current directory, that program is executed, permitting the
attacker to execute arbitrary code.  This security problem does not affect Unix
systems.  This is the same issue as CVE-2020-27955, but the fix for that issue
was incomplete and certain options can still cause the problem to occur.

This occurs because on Windows, Go includes (and prefers) the current directory
when the name of a command run does not contain a directory separator.  This has
been solved by always using PATH to pre-resolve paths before handing them to Go.

We would like to extend a special thanks to the following open-source
contributors:

* @Ry0taK for reporting this to us responsibly

### Bugs

* Use subprocess for invoking all commands (@bk2204)

## 2.13.1 (11 Dec 2020)

This release fixes a bug in our build tooling that prevents our release process
from working properly.  This release is otherwise identical to 2.13.0.

### Misc

* Makefile: don't fail the second time macOS builds are built #4341 (@bk2204)

## 2.13.0 (10 Dec 2020)

This release introduces several new features, such as the `--above` option to
`git lfs migrate import` and support for `socks5h` proxies.  In addition, many
bugs have been fixed and several miscellaneous fixes have been included.

Unless someone steps up to fix and maintain NTLM support, this will be the last
Git LFS release to support NTLM.  See #4247 for more details.  Note that Git LFS
supports Kerberos as well, which is far more secure and may be a viable
replacement in many situations.

We would like to extend a special thanks to the following open-source
contributors:

* @EliRibble for adding support for the `--above` option to `git lfs migrate import`
* @andrewshadura for adding support for the `GIT_LFS_SKIP_PUSH` environment variable
* @sinbad for fixing problems with retaining objects used by stashes
* @tklauser for cleaning up our use of error constants in the code

### Features

* Add --above parameter to 'migrate import'. #4276 (@EliRibble)
* Add GIT_LFS_SKIP_PUSH to allow skipping the pre-push hook #4202 (@andrewshadura)
* lfshttp: add support for socks5h proxies #4259 (@bk2204)
* Add manual pages to release assets #4230 (@bk2204)
* Honor GIT_WORK_TREE #4269 (@bk2204)

### Bugs

* Make git lfs migrate import handle missing extensions #4318 (@bk2204)
* fs: don't panic when using a too-short object ID to push #4307 (@bk2204)
* Fix pattern matching for .gitattributes #4301 (@bk2204)
* config: map missing port to default for HTTP key lookups #4282 (@bk2204)
* tools: use IoctlFileClone from golang.org/x/sys/unix #4261 (@tklauser)
* tools/util_darwin.go: Remove use of direct syscalls #4251 (@stanhu)
* tools: always force a UTF-8 locale for cygpath #4231 (@bk2204)
* prune: fix deleting objects referred to by stashes #4209 (@sinbad)

### Misc

* migrate import: warn about refs on case insensitive file systems #4332 (@larsxschneider)
* Drop obsolete OS support #4328 (@bk2204)
* tools: use ERROR_SHARING_VIOLATION const from golang.org/x/sys/windows #4291 (@tklauser)
* pull: gracefully handle merge conflicts #4289 (@bk2204)
* script/upload: avoid using Ruby's URI.escape #4266 (@bk2204)
* add documentation of security bug report process #4244 (@chrisd8088)

## 2.12.1 (4 Nov 2020)

This release introduces a security fix for Windows systems, which has been
assigned CVE-2020-27955.

On Windows, if Git LFS operates on a malicious repository with a git.bat or
git.exe file in the current directory, that program is executed, permitting the
attacker to execute arbitrary code.  This security problem does not affect Unix
systems.

This occurs because on Windows, Go includes (and prefers) the current directory
when the name of a command run does not contain a directory separator.  This has
been solved by always using PATH to pre-resolve paths before handing them to Go.

We would like to extend a special thanks to the following open-source
contributors:

* @dawidgolunski for reporting this to us responsibly

### Bugs

* subprocess: avoid using relative program names (@bk2204)

## 2.12.0 (1 Sep 2020)

This release introduces several new features, such as support for the SHA-256
repositories coming in a future version of Git, restored support for Go 1.11,
the ability to read the contents of .lfsconfig from the repository, signed and
notarized binaries on macOS, and pre-built 32-bit ARM binaries on Linux.  In
addition, several bugs have been fixed and miscellaneous fixes included.

Note that macOS releases are now shipped as zip files, not tarballs, since it is
not possible to notarize tarballs.  macOS releases are now also built on macOS,
so `git lfs dedup` should now function.

We would like to extend a special thanks to the following open-source
contributors:

* @saracen for adding support for ARM binaries
* @mversluys for improving locking support
* @cccfeng for updating our documentation to make it more readable
* @bluekeyes for improving performance and tracing
* @gertcuykens for adding missing parts of our documentation

### Features

* config: optionally read .lfsconfig from the repository #4200 (@bk2204)
* Support SHA-256 repositories #4186 (@bk2204)
* allow Go 1.11 builds by using WaitStatus.ExitStatus() #4183 (@chrisd8088)
* add --worktree option to install and uninstall commands #4159 (@chrisd8088)
* Sign and notarize binaries on macOS #4143 (@bk2204)
* Makefile: add linux arm build and release targets #4126 (@saracen)
* Allow locking and unlocking non-existent files #3992 (@mversluys)

### Bugs

* docs/api/locking: add an explicit <br> #4208 (@cccfeng)
* Fix hang when the user lacks permissions #4207 (@bk2204)
* Don't mark unlocked files that aren't lockable as read-only #4171 (@bk2204)
* locking: make patterns with slashes work on Windows #4139 (@bk2204)
* git: consider full refspec when determining seen refs #4133 (@bk2204)

### Misc

* Fix Windows CI #4199 (@bk2204)
* Fix testsuite when working with non-master default branch #4174 (@bk2204)
* git: improve performance of remote ref listing #4176 (@bluekeyes)
* subprocess: trace all command execution #4175 (@bluekeyes)
* Update git-lfs-migrate.1.ronn #3869 (@gertcuykens)
* t: use repo v1 with extensions #4177 (@bk2204)
* Makefile: ensure temp Go modules can be deleted #4157 (@chrisd8088)
* Improve test suite robustness via environment #4132 (@bk2204)

## 2.11.0 (8 May 2020)

This release introduces several new features, such as better support for unnamed
local paths and URLs as remotes, support for `submodule.recurse`, exponential
backoff on failure, and support for renegotiation.  In addition, numerous bugs
have been fixed and miscellaneous issues have been addressed.

We would like to extend a special thanks to the following open-source
contributors:

* @bluekeyes for adding support for exponential backoff
* @pluehne for adding support for `submodule.recurse`
* @Electric26 for fixing the default behavior of a prompt
* @nataliechen1 for fixing certain upload retry failures
* @shalashik for fixing a panic during cherry-pick
* @swisspol for updating our documentation to reflect supported `.lfsconfig`
  keys
* @dan2468 for updating the copyright year

### Features

* Allow literal local paths as remotes #4119 (@bk2204)
* pre-push: find named remote for URL if possible #4103 (@bk2204)
* tq: add exponential backoff for retries #4097 (@bluekeyes)
* migrate import: set text to unspecified for excluded fields #4068 (@bk2204)
* Update list of distros for packagecloud.io #4080 (@bk2204)
* lfshttp: allow renegotiation #4066 (@bk2204)
* Support submodule.recurse = true #4063 (@pluehne)
* add man page for the post-commit hook command #4052 (@chrisd8088)
* Add an option to control warning about files larger than 4 GiB #4009 (@bk2204)

### Bugs

* commands/command_migrate.go: fix bug #4116 (@Electric26)
* git: avoid "bad object" messages when force-pushing #4102 (@bk2204)
* git: avoid trying to rewrite remote tags as remote branches #4096 (@bk2204)
* make Go tests run consistently using local binary #4084 (@chrisd8088)
* commands: don't honor lfs.fetch* for ls-files #4083 (@bk2204)
* commands: print help output with --help #4059 (@bk2204)
* fail dedup command with explanation when LFS extensions configured #4045 (@chrisd8088)
* fix upload retry 'file already closed' issue' #4042 (@nataliechen1)
* commands/command_filter_process: cherry-pick of several commits cause panic error #4017 (@shalashik)
* Check error when creating local storage directory #4016 (@bk2204)
* track: detect duplicate patterns with --filename #4000 (@bk2204)

### Misc

* Removed lfs.extension.* from list of supported keys for .lfsconfig #4044 (@swisspol)
* Tidy modules #4035 (@bk2204)
* README: explain how to verify releases #4022 (@bk2204)
* docs: document git lfs migrate --yes #4023 (@bk2204)
* Stop using cgo on amd64 Linux #4026 (@bk2204)
* updated copyright year #3995 (@dan2468)

## 2.10.0 (21 January 2020)

This release introduces several new features, such as support for local paths in
remotes, Kerberos support, and official binaries for S390x and little-endian
64-bit PowerPC systems.  In addition, numerous bugs have been fixed and
miscellaneous issues have been addressed.

We would like to extend a special thanks to the following open-source
contributors:

* @ganadist for fixing a bug in the output of `git lfs env`
* @exceed-alae for fixing a possible nil pointer dereference
* @slonopotamus for improvements to Windows support and code cleanups
* @nataliechen1 for fixing a data race
* @ssgelm for writing and updating the code to use a new cookie jar parser
* @austintraver for improving the output of `git lfs status`
* @nikola-sh for improving option parity with Git
* @alrs for fixing several error checks in the testsuite
* @pluehne for improving our support for uncommon references

### Features

* Optimize pushes for multiple refs #3978 (@bk2204)
* Include ppc64le and s390x Linux builds in releases #3983 (@bk2204)
* Kerberos (SPNEGO) support for HTTP #3941 (@bk2204)
* Add support for local paths #3918 (@bk2204)
* Allow specifying HTTP version to use #3887 (@bk2204)

### Bugs

* t-duplicate-oids: use correct awk indexing #3981 (@bk2204)
* Improved proxy support #3972 (@bk2204)
* install: don't print error if run outside repository #3969 (@bk2204)
* debian: bump version of golang-go #3959 (@bk2204)
* lfshttp: Set valid default value for lfs.concurrenttransfers #3949 (@ganadist)
* Add nil-check on defer block of DoTransfer() #3936 (@exceed-alae)
* Retry batch failures #3930 (@bk2204)
* rpm: use old setup code on CentOS 7 #3938 (@bk2204)
* Interpret relative hook paths as relative to working tree #3926 (@bk2204)
* Handle missing cygpath gracefully #3910 (@bk2204)
* Update index before showing status #3921 (@bk2204)
* Honor lfs.url when deciding on transfer adapters #3905 (@bk2204)
* Implement retry logic to fix LFS storage race conditions on Windows #3890 (@slonopotamus)
* Avoid hang when using git hash-object --stdin --path #3902 (@bk2204)
* synchronize access to netrcCredentialHelper.skip #3896 (@nataliechen1)

### Misc

* Improve license files #3973 (@bk2204)
* Add CI link to CI badge in README #3960 (@slonopotamus)
* Clarify output shown by `git lfs status` #3953 (@austintraver)
* Revert "ci: force Windows Git version to 2.22.0" #3903 (@bk2204)
* Better document pointer format constraints #3944 (@bk2204)
* Don't abort with newer Git when in a bare repo #3940 (@bk2204)
* Fix more Linux package issues #3932 (@bk2204)
* docs: explain shell metacharacters better #3920 (@bk2204)
* Reset the text attribute on export #3913 (@bk2204)
* Support schannel ssl backend #3868 (@nikola-sh)
* Allow migrate export to handle non-pointer files gracefully #3911 (@bk2204)
* git/gitattr: fix dropped test errors #3904 (@alrs)
* Accept all local references with git lfs push #3876 (@pluehne)
* Drop pre-1.6 Go compatibility code #3897 (@slonopotamus)
* tools/kv: Fix dropped test error #3882 (@alrs)
* Use different parser for cookiejar files #3886 (@ssgelm)
* Stop replacing files in LFS storage when downloading them concurrently on Windows #3880 (@slonopotamus)
* Fix error strings to follow Go guidelines #3871 (@slonopotamus)
* Miscellaneous release fixes #3866 (@bk2204)

## 2.9.2 (12 December 2019)

This release fixes a few regressions, such as a possible nil pointer
dereference, a failure to retry batch requests, and a bug where repositories
could fail to be detected on Windows.

We would like to extend a special thanks to the following open-source
contributors:

* @exceed-alae for fixing a possible nil pointer dereference

### Bugs

* Add nil-check on defer block of DoTransfer() #3936 (@exceed-alae)
* Retry batch failures #3930 (@bk2204)
* rpm: use old setup code on CentOS 7 #3938 (@bk2204)
* Handle missing cygpath gracefully #3910 (@bk2204)

### Misc

* Don't abort with newer Git when in a bare repo #3940 (@bk2204)
* Fix more Linux package issues #3932 (@bk2204)

## 2.9.1 (25 November 2019)

This release fixes a few regressions, such as the ability to use HTTP/1.1 when
required, addresses a race condition, and switches the cookie jar parser to
something that's easier for distributions to package.

We would like to extend a special thanks to the following open-source
contributors:

* @nataliechen1 for fixing a data race
* @ssgelm for writing and updating the code to use a new cookie jar parser

### Features

* Allow specifying HTTP version to use #3887 (@bk2204)

### Bugs

* synchronize access to netrcCredentialHelper.skip #3896 (@nataliechen1)
* Fix several causes of CI problems #3878 (@bk2204)
* Miscellaneous release fixes #3866 (@bk2204)

### Misc

* Build artifacts during CI for easier testing #3892 (@bk2204)
* Use different parser for cookiejar files #3886 (@ssgelm)

## 2.9.0 (17 October 2019)

This release adds support for DragonFly BSD, adds a new `git lfs dedup` command
to save space if the file system supports it, adds support for file URLs,
improves the performance when walking the repository, contains improvements
to use HTTP/2 when available and cookies when required, and numerous other bug
fixes, features, and modifications.

We would like to extend a special thanks to the following open-source
contributors:

* @pluehne for adding support for fetching the history of specific refs
* @kupson for adding cookie support
* @liweitianux for adding Dragonfly BSD support
* @kazuki-ma for implementing de-duplication support
* @dvdveer for adding range support to ls-files
* @dyrone, @pmeerw, @yamiacat, and @kittenking for cleaning up some documentation issues
* @slonopotamus for improving concurrent downloads
* @nataliechen1 for fixing remote names with dots
* @jw3 for removing excessive logging
* @SeamusConnor for significantly improving performance when walking the repository

### Features

* Support fetching entire history of specific refs #3849 (@pluehne)
* Add support for CentOS 8 #3854 (@bk2204)
* Let git-lfs HTTPS transport send cookies #3825 (@kupson)
* Support DragonFly BSD #3837 (@liweitianux)
* HTTP/2 protocol support #3793 (@PastelMobileSuit)
* Add clonefile on Windows over ReFS support. #3790 (@kazuki-ma)
* Add new command `git lfs dedup` for file system level de-duplication. #3753 (@kazuki-ma)
* Support GIT_ALTERNATE_OBJECT_DIRECTORIES #3765 (@bk2204)
* ls-files: add support for reference range #3764 (@dvdveer)
* Add several additional distros for packagecloud.io #3751 (@bk2204)
* Provide an option to track to handle paths literally #3756 (@bk2204)
* Optimize traversal of Git objects with URL remotes #3755 (@bk2204)
* Support for file URLs #3748 (@bk2204)
* Add clone file on MacOS X (darwin). #3745 (@kazuki-ma)

### Bugs

* Fix JSON comma problems in docs #3851 (@dyrone)
* Remove redundant comma in batch.md #3841 (@dyrone)
* More robust handling of parallel attempts to download the same file #3826 (@slonopotamus)
* Update wildmatch to v1.0.4 #3820 (@bk2204)
* Update to gitobj v1.4.1 #3815 (@bk2204)
* Fix build error when cross-compiling #3817 (@bk2204)
* Do not fail when multiple processes download the same lfs file #3813 (@slonopotamus)
* Fix Remote Name Parsing Bug #3812 (@nataliechen1)
* status: gracefully handle files replaced by directories #3768 (@bk2204)
* Avoid deadlock when transfer queue fails #3800 (@bk2204)
* Avoid a hang when Git is slow to provide us data #3806 (@bk2204)
* tasklog/log.go: print "done" messages with a trailing period #3789 (@ttaylorr)
* track: make --filename work with spaces #3785 (@bk2204)
* Fix couple of 'the the' typos #3786 (@pmeerw)
* Use an absolute path for smudging #3780 (@bk2204)
* Fix URL parsing with Go 1.12.8 #3771 (@bk2204)
* Fix remote autoselection when not on a branch #3759 (@bk2204)
* Replace deprecated SEEK_SET, SEEK_CUR usage. #3739 (@kazuki-ma)
* Do not log skipped checkouts to file #3736 (@jw3)
* Fix typos across git-lfs repository #3728 (@kittenking)
* Accept legacy Git SSH URLs #3713 (@bk2204)

### Misc

* ls-files --all man patch #3859 (@yamiacat)
* Reworked to use git ls-files in some circumstances instead of FastWalkGitRepo #3823 (@SeamusConnor)
* Clean up go.mod for Go 1.13 #3807 (@bk2204)
* Use FICLONE instead of BTRFS_IOC_CLONE. #3796 (@kazuki-ma)
* Remove unused pty code #3737 (@bk2204)

## 2.8.0 (23 July 2019)

This release adds support for SOCKS proxies and Windows junctions, adds native
packages for Debian 10 and similar distributions, reduces the number of
situations in which running `git lfs fetch --all` is required, improves
compatibility with Cygwin, and numerous other bug fixes and modifications.

We would like to extend a special thanks to the following open-source
contributors:

* @mstrap for adding support for listing lock owners
* @h-hirokawa for adding support for rewriting object URLs
* @slonopotamus for helping get our specs and implementation in sync
* @ssgelm for improving our Debian packaging
* @TBK for fixing a test
* @hartzell for improving the compatibility of our Makefile
* @AJH16 for implementing support for NTLM SSO

### Features

* Don't fail if we lack objects the server has #3634 (@bk2204)
* Add support for Debian 10 #3697 (@bk2204)
* Migrate tags pointing to other tags #3690 (@bk2204)
* Add support for SOCKS proxies #3677 (@bk2204)
* Allow vendors to customize the version info #3636 (@bk2204)
* Wrap credential data to allow late credential prompting and update NTLM/SSPI to attempt SSPI login prior to prompting for credentials. #3617 (@AJH16)
* git-lfs locks should optionally denote own locks #3569 (@mstrap)
* tq/adapterbase: support rewriting href #3590 (@h-hirokawa)
* Handle Windows junctions properly #3560 (@bk2204)
* Allow specifying multiple insteadOf aliases #3550 (@bk2204)

### Bugs

* Make API documentation lock creation example less confusing #3648 (@bk2204)
* Use a download token when searching locks #3715 (@bk2204)
* Copy mode from original file when rewriting objects #3694 (@bk2204)
* Don't recurse into submodules when walking repository #3686 (@bk2204)
* Be more precise about what timestamps we accept #3680 (@bk2204)
* Canonicalize common directory paths on Cygwin #3671 (@bk2204)
* Ensure we always use correct Content-Type and Accept headers #3663 (@bk2204)
* Fix 'owner' lock field not documented as optional #3651 (@slonopotamus)
* Improve error handling in git lfs install #3624 (@bk2204)
* Properly handle config options for URLs with upper case letters #3584 (@bk2204)
* Detect Cygwin-style pipe TTYs as TTYs #3582 (@bk2204)
* Set push remote for pre-push #3579 (@bk2204)
* Switch from manually running go generate to using dh-golang to run it #3549 (@ssgelm)
* Install worktree hooks in the proper directory #3547 (@bk2204)
* Avoid nil pointer dereference on download failure #3537 (@bk2204)
* Avoid nil pointer dereference on unexpected failure #3534 (@bk2204)

### Misc

* Update gitobj to v1.3.1 #3716 (@bk2204)
* Use default line endings for core.autocrlf=input #3712 (@bk2204)
* Fix CircleCI #3710 (@bk2204)
* Vendor in gitobj v1.3.0 #3685 (@bk2204)
* Update CONTRIBUTING #3673 (@bk2204)
* Fix typo in t-locks.sh #3666 (@TBK)
* Make 'locked_at' required in JSON schema #3655 (@slonopotamus)
* Document a new batch error code #3639 (@bk2204)
* Fix invalid JSON in LFS locking API documentation #3650 (@slonopotamus)
* Fix invalid JSON in locking protocol docs #3644 (@slonopotamus)
* Various release updates #3623 (@bk2204)
* tq/adapterbase: fix typo enableHrefRerite to enableHrefRewrite #3594 (@h-hirokawa)
* Use git-lfs version of go-ntlm #3588 (@bk2204)
* Log test server standard error to log file #3577 (@bk2204)
* Don't set -extldflags unless LDFLAGS has a value #3545 (@hartzell)
* Retry on oversize file #3518 (@bk2204)
* Fix asset uploading during releases #3538 (@bk2204)

## 2.7.0 (15 February 2019)

This release adds better support for large files on 32-bit systems, adds
attribute macros, fixes several file descriptor leaks, improves compatibility
with Git's configuration parsing, and includes numerous other bug fixes and
modifications.

We would like to extend a special thanks to the following open-source
contributors:

* @andyneff and @torbjoernk for updating our release targets
* @zkry for work on rate-limiting
* @Foxboron for work on reproducible builds
* @mstrap for adding a release target for Linux arm64
* @keiko713, @Erwyn, and @mloskot for improving our documentation
* @QuLogic for fixing our tests under SELinux
* @saracen and @steffengodskesen for improving our output handling
* @mbsulliv for finding and fixing a bug where we ran out of file descriptors

### Features

* Add sles 15 support #1055 #3515 (@andyneff)
* docs/man/git-lfs-config.5.ronn: document GIT_LFS_SKIP_SMUDGE #3509 (@ttaylorr)
* commands/command_pointer.go: introduce `--check` option #3501 (@ttaylorr)
* Makefile additions for reproducible builds and asmflags #3444 (@Foxboron)
* locking: add flag to control modification of ignored files #3409 (@bk2204)
* build package for Ubuntu 18.10 aka Cosmic #3402 (@torbjoernk)
* Add support for retries with delays (ex. rate limiting) #3449 (@zkry)
* Trim embedded paths out of binaries #3443 (@bk2204)
* Ensure 32-bit Git LFS binaries can handle files larger than 4 GiB #3426 (@bk2204)
* Support attribute macros #3391 (@bk2204)
* tasklog: don't log progress status when stdout is not a tty #3349 (@steffengodskesen)
* locking: cache JSON response from server #3253 (@mstrap)
* tq: enable transfer debugging when GIT_CURL_VERBOSE is set #3341 (@bk2204)

### Bugs

* .circleci: don't use 'brew prune' #3514 (@ttaylorr)
* t/t-smudge.sh: remove unnecessary test #3513 (@ttaylorr)
* docs/man: fix inconsistency in 'git-lfs-ls-files(1)' #3496 (@ttaylorr)
* lfshttp: close body on redirect #3479 (@bk2204)
* status: handle deleted files gracefully #3482 (@bk2204)
* Fix hang in prune with too few file descriptors #3460 (@bk2204)
* Fix parameter name on List Locks API Documentation #3477 (@Erwyn)
* TST: Trim security context when checking permissions. #3476 (@QuLogic)
* command/env: ensure we honor lfs.url #3470 (@bk2204)
* Fix swapped case sensitivity in patterns #3433 (@bk2204)
* core.sharedRepository improvements for directories #3417 (@bk2204)
* Update the doc of whitelisted .lfsconfig keys #3423 (@keiko713)
* Rewrite URL config-matching #3392 (@PastelMobileSuit)
* git: close blob objects when finished #3379 (@bk2204)
* Avoid hang in repos cloned with --shared or --reference #3383 (@bk2204)
* commands/command_status.go: require a working copy #3378 (@ttaylorr)
* Fix test server API #3377 (@bk2204)
* vendor: don't remove necessary dependencies #3356 (@ttaylorr)
* filepathfilter: don't say file is both accepted and rejected #3360 (@bk2204)
* Support pushInsteadOf aliases when determining endpoints #3353 (@bk2204)
* Close attributes file #3347 (@mbsulliv)
* Fix humanize's FormatByteRate() to work with 0s duration #3340 (@saracen)

### Misc

* Release automation #3510 (@bk2204)
* docs/man: update `git-lfs-fetch(1)` manpage #3488 (@ttaylorr)
* Update Cobra #3483 (@bk2204)
* Run go generate only on Windows #3480 (@bk2204)
* docs/man/git-lfs-migrate: make examples less confusing #3424 (@bk2204)
* Modify logic of 'migrate info' to process extensionless files #3458 (@zkry)
* Improve error message on missing object #3398 (@bk2204)
* docs/man: suggest using Git configuration for LFS keys #3394 (@bk2204)
* Document default value of migrate info --top=<n> #3387 (@mloskot)
* Clarify minimum git version #3327 (@carlwgeorge)

## 2.6.1 (3 December 2018)

This release contains miscellaneous bug fixes since v2.6.0. Most notably,
release v2.6.1 restores support for alternate repositories, which was
accidentally broken in v2.6.0.

### Bugs

* git: close blob objects when finished #3379 (@bk2204)
* Avoid hang in repos cloned with --shared or --reference #3383 (@bk2204)
* vendor: don't remove necessary dependencies #3356 (@ttaylorr)

## 2.6.0 (1 November, 2018)

This release adds better support for redirecting network calls from a Git LFS
API server to one that requires a different authentication mode, builds Git LFS
on Go 1.11, and numerous other bug fixes and modifications.

We would like to extend a special thanks to the following open-source
contributors:

* @andyneff for updating our release targets
* @gtsiolis: for removing the deprecated `git lfs clone` from the listing of
  supported Git LFS commands
* @jsantell for fixing a formatting issue in the INCLUDE AND EXCLUDE man page
  section
* @mmlb for adding a release target for Linux arm64
* @skashyap7 for adding the 'git lfs track -n'
* @Villemoes: for modernizing the Git LFS installation procedure on Debian.

### Features

* commands: list explicitly excluded patterns separately #3320 (@bk2204)
* Uninstall improvements #3326 (@bk2204)
* config: honor GIT_AUTHOR_DATE and GIT_COMMITTER_DATE #3314 (@bk2204)
* Add new `.netrc` credential helper #3307 (@PastelMobileSuit)
* Honor umask and core.sharedRepository #3304 (@bk2204)
* Support listing only filename tracked by git lfs using --name (-n) option
  #3271 (@skashyap7)
* all: use Go 1.11.1 in CI #3298 (@ttaylorr)
* lfsapi/tq: Have DoWithAuth() caller determine URL Access Mode #3293
  (@PastelMobileSuit)
* commands: undeprecate checkout #3303 (@bk2204)
* Checkout options for conflicts #3296 (@bk2204)
* Makefile: build source tarballs for release #3283 (@bk2204)
* Encrypted SSL key support #3270 (@bk2204)
* Add support for core.sshCommand #3235 (@bk2204)
* gitobj-based Object Scanner #3236 (@bk2204)
* README.md: new core team members #3217 (@ttaylorr)
* Add build and releases for linux arm64 #3196 (@mmlb)
* Update packagecloud.rb #3210 (@andyneff)
* all: use Go modules instead of Glide #3208 (@ttaylorr)
* all: use Go 1.11 in CI #3203 (@ttaylorr)

### Bugs

* Fix formatting of INCLUDE AND EXCLUDE (REFS) #3330 (@jsantell)
* go.sum: add missing entries #3319 (@bk2204)
* Ensure correct syntax for commit headers in lfs migrate import #3313 (@bk2204)
* Clean up trailing whitespace #3299 (@bk2204)
* commands: unambiguously resolve remote references #3285 (@ttaylorr)
* Expand custom transfer args by using the shell #3259 (@bk2204)
* Canonicalize paths properly on Windows #3277 (@bk2204)
* debian/prerm: add --system flag #3272 (@Villemoes)
* t: make testsuite run under git rebase -x #3262 (@bk2204)
* git/gitattr: parse 'set' attributes #3255 (@ttaylorr)
* t: avoid panic in lfstest-customadapter #3243 (@bk2204)
* t: avoid using shell variables in printf's first argument #3242 (@bk2204)
* lfsapi: handle SSH hostnames and aliases without users #3230 (@bk2204)
* commands/command_ls_files.go: ignore index with argument #3219 (@ttaylorr)
* commands/command_migrate_import.go: install hooks #3227 (@ttaylorr)
* t: mark test sources as .PHONY #3228 (@ttaylorr)
* Pass GIT_SSH_COMMAND to the shell #3199 (@bk2204)
* Tidy misformatted files #3202 (@bk2204)
* config: expand core.hooksPath #3212 (@ttaylorr)
* locks: manage write permissions of ignored files #3190 (@ttaylorr)

### Misc

* CONTRIBUTING.md: :nail_care: #3325 (@ttaylorr)
* Update CONTRIBUTING #3317 (@bk2204)
* go.mod: depend on tagged gitobj #3311 (@ttaylorr)
* RFC: SSH protocol #3290 (@bk2204)
* Remove `git lfs clone` command from man #3301 (@gtsiolis)
* ROADMAP.md: use GitHub issues instead #3286 (@ttaylorr)
* docs: add note about closing release milestone #3274 (@bk2204)
* CI improvements #3268 (@bk2204)
* docs/howto: document our release process #3261 (@ttaylorr)
* Create new lfshttp package #3244 (@PastelMobileSuit)
* CONTRIBUTING: update required go version #3232 (@PastelMobileSuit)
* go.mod: use latest github.com/olekukonko/ts #3223 (@ttaylorr)
* go.mod: pin github.com/git-lfs/wildmatch to v1.0.0 #3218 (@ttaylorr)
* Update README.md #3193 (@srl295)

## 2.5.2 (17 September, 2018)

### Bugs

* config: Treat [host:port]:path URLs correctly #3226 (@saschpe)
* tq: Always provide a Content-Type when uploading files #3201 (@bk2204)
* commands/track: Properly `lfs track` files with escaped characters in their
  name #3192 (@leonid-s-usov)

### Misc

* packagecloud.rb: remove older versions #3210 (@andyneff)

## 2.5.1 (2 August, 2018)

This release contains miscellaneous bug fixes since v2.5.0. Most notably,
release v2.5.1 allows a user to disable automatic Content-Type detection
(released in v2.5.0) via `git config lfs.contenttype false` for hosts that do
not support it.

### Features

* tq: make Content-Type detection disable-able #3163 (@ttaylorr)

### Bugs

* Makefile: add explicit rule for commands/mancontent_gen.go #3160 (@jj1bdx)
* script/install.sh: mark as executable #3155 (@ttaylorr)
* config: add origin to remote list #3152 (@PastelMobileSuit)

### Misc

* docs/man/mangen.go: don't show non-fatal output without --verbose #3168
  (@ttaylorr)
* LICENSE.md: update copyright year #3156 (@IMJ355)
* Makefile: silence some output #3164 (@ttaylorr)
* Makefile: list prerequisites for resource.syso #3153 (@ttaylorr)

## 2.5.0 (26 July, 2018)

This release adds three new migration modes, updated developer ergonomics, and
a handful of bug fixes to Git LFS.

We would like to extend a special thanks to the following open-source
contributors:

* @calavera for fixing a broken Go test and adding support for custom
  Content-Type headers in #3137 and #3138.
* @cbuehlmann for adding support for encoded character names in filepaths via
  #3093.
* @larsxschneider for changing the default value of lfs.allowincompletepush in
  #3109.
* @NoEffex for supporting TTL in SSH-based authentication tokens via #2867.
* @ssgelm for adding 'go generate' to our Debian packages via #3083.

### Features

* Makefile: replace many scripts with make targets #3144 (@ttaylorr)
* {.travis,appveyor}.yml: upgrade to Go 1.10.3 #3146 (@ttaylorr)
* t: run tests using prove #3125 (@ttaylorr)
* commands/migrate: infer wildmatches with --fixup #3114 (@ttaylorr)
* Retry SSH resolution 5 times #2934 (@stanhu)
* Implement `migrate export` subcommand #3084 (@PastelMobileSuit)
* Add `--no-rewrite` flag to `migrate import` command #3029 (@PastelMobileSuit)

### Bugs

* t: fix contains_same_elements() fn #3145 (@PastelMobileSuit)
* commands: warn if working copy is dirty #3124 (@ttaylorr)
* Ensure provided remote takes precedence over configured pushRemote #3139 (@PastelMobileSuit)
* Fix proxy unit tests. #3138 (@calavera)
* commands/command_migrate.go: loosen meaning of '--everything' #3121 (@ttaylorr)
* lfsapi: don't query askpass for given creds #3126 (@PastelMobileSuit)
* config/git_fetcher.go: mark 'lfs.allowincompletepush' as safe #3113 (@ttaylorr)
* fs: support multiple object alternates #3116 (@ttaylorr)
* commands/checkout: checkout over read-only files #3120 (@ttaylorr)
* test/testhelpers.sh: look for 64 character SHA-256's #3119 (@ttaylorr)
* config/config.go: case-insensitive error search #3098 (@ttaylorr)
* Encoded characters in pathnames #3093 (@cbuehlmann)
* Support default TTL for authentication tokens acquired via SSH #2867 (@NoEffex)
* commands/status.go: relative paths outside of root #3080 (@ttaylorr)
* Run `go generate` on commands in deb build #3083 (@ssgelm)
* lfsapi: prefer proxying from gitconfig before environment #3062 (@ttaylorr)
* commands/track: respect global- and system-level gitattributes #3076 (@ttaylorr)
* git/git.go: pass --multiple to git-fetch(1) when appropriate #3063 (@ttaylorr)
* commands/checkout: fix inaccurate messaging #3055 (@ttaylorr)
* commands/migrate: do not migrate empty commits #3054 (@ttaylorr)
* git/odb: retain trailing newlines in commit messages #3053 (@ttaylorr)

### Misc

* Set original file content type on basic upload. #3137 (@calavera)
* README.md: Git for Windows ships LFS by default #3112 (@larsxschneider)
* change lfs.allowincompletepush default from true to false  #3109 (@larsxschneider)
* *: replace git/odb with vendored copy #3108 (@ttaylorr)
* test/test-ls-files.sh: skip on CircleCI #3101 (@ttaylorr)
* lfsapi/ssh.go: use zero-value sentinels #3099 (@ttaylorr)
* README.md: add link to installation wiki page #3075 (@ttaylorr)
* docs/man/git-lfs.1.ronn: update casing and missing commands #3059 (@ttaylorr)
* commands/checkout: mark 'git lfs checkout' as deprecated #3056 (@ttaylorr)

## 2.4.2 (28 May, 2018)

### Bugs

* lfsapi: re-authenticate HTTP redirects when needed #3028 (@ttaylorr)
* lfsapi: allow unknown keywords in netrc file(s) #3027 (@ttaylorr)

## 2.4.1 (18 May, 2018)

This release fixes a handful of bugs found and fixed since v2.4.0. In
particular, Git LFS no longer panic()'s after invalid API responses, can
correctly run 'fetch' on SHAs instead of references, migrates symbolic links
correctly, and avoids writing to `$HOME/.gitconfig` more than is necessary.

We would like to extend a "thank you" to the following contributors for their
gracious patches:

- @QuLogic fixed an issue with running tests that require credentials
- @patrickmarlier made it possible for 'git lfs migrate import' to work
  correctly with symbolic links.
- @zackse fixed an inconsistency in `CONTRIBUTING.md`
- @zanglang fixed an inconsistency in `README.md`

Git LFS would not be possible without generous contributions from the
open-source community. For these, and many more: thank you!

### Features

* script/packagecloud.rb: release on Ubuntu Bionic #2961 (@ttaylorr)

### Bugs

* lfsapi: canonicalize extra HTTP headers #3010 (@ttaylorr)
* commands/lock: follow symlinks before locking #2996 (@ttaylorr)
* lfs/attribute.go: remove default value from upgradeables #2994 (@ttaylorr)
* git: include SHA1 in ref-less revisions #2982 (@ttaylorr)
* Do not migrate the symlinks to LFS objects. #2983 (@patrickmarlier)
* commands/uninstall: do not log about global hooks with --local #2976 (@ttaylorr)
* commands/run.go: exit 127 on unknown sub-command #2969 (@ttaylorr)
* commands/{un,}track: perform "prefix-agnostic" comparisons #2955 (@ttaylorr)
* commands/migrate: escape paths before .gitattributes  #2933 (@ttaylorr)
* commands/ls-files: do not accept '--all' after '--' #2932 (@ttaylorr)
* tq: prevent uint64 underflow with invalid API response #2902 (@ttaylorr)

### Misc

* test/test-env: skip comparing GIT_EXEC_PATH #3015 (@ttaylorr)
* remove reference to CLA from contributor's guide #2997 (@zackse)
* .gitattributes link is broken #2985 (@zanglang)
* commands: make --version a synonym for 'version' #2968, #3017 (@ttaylorr)
* test: ensure that git-mergetool(1) works with large files #2939 (@ttaylorr)
* README.md: note the correct PackageCloud URL #2960 (@ttaylorr)
* README.md: mention note about `git lfs track` retroactively #2948 (@ttaylorr)
* README.md: reorganize into Core Team, Alumni #2941 (@ttaylorr)
* README.md: :nail_care: #2942 (@ttaylorr)
* circle.yml: upgrade to 'version: 2' syntax #2928 (@ttaylorr)
* Use unique repo name for tests that require credentials. #2901 (@QuLogic)

## 2.4.0 (2 March, 2018)

This release introduces a rewrite of the underlying file matching engine,
expands the API to include relevant refspecs for individual requests,
standardizes the progress output among commands, and more.

Please note: in the next MAJOR release (v3.0.0) the semantic meaning behind
`--include` and `--exclude` flags will change. As the details of exactly which
existing patterns will no longer function as previously are known, we will
indicate them here. Any `--include` or `--exclude` patterns used in v2.3.0 or
earlier are expected to work as previously in this release.

This release would not be possible without the open-source community.
Specifically, we would like to thank:

- @larsxschneider: for contributing fixes to the filter operation in `git lfs
  fsck`, and `git lfs prune`, as well as the bug report leading to the
  filepathfilter changes.
- @yfronto: for adding new Linux release targets.
- @stffabi: for adding support for NTLM with SSPI on Windows.
- @jeffreydwalter: for fixing memory alignment issues with `sync/atomic` on
  32-bit architectures.
- @b4mboo: for adding a LFS configuration key to the list of safe configuration
  options.

Without the aforementioned indviduals, this release would not have been
possible. Thank you!

### Features

* __Support wildmatch-compliant options in `--include`, `--exclude`__
  * filepathfilter: implement using wildmatch #2875 (@ttaylorr)
  * test: add wildmatch migration tests #2888 (@larsxschneider, @ttaylorr)
* __Expand the specification to include relevant refspecs__
  * verify locks against each ref being pushed #2706 (@technoweenie)
  * Batch send refspec take 2 #2809 (@technoweenie)
  * Run 1 TransferQueue per uploaded ref #2806 (@technoweenie)
  * Locks/verify: full refspec #2722 (@technoweenie)
  * send remote refspec for the other lock commands #2773 (@technoweenie)
* __Standardize progress meter output and implementation__
  * tq: standardized progress meter formatting #2811 (@ttaylorr)
  * commands/fetch: unify formatting #2758 (@ttaylorr)
  * commands/prune: unify formatting #2757 (@ttaylorr)
  * progress: use git/githistory/log package for formatting #2732 (@ttaylorr)
  * progress: remove `*progress.Meter` #2762 (@ttaylorr)
  * tasklog: teach `*Logger` how to enqueue new `*SimpleTask`'s #2767 (@ttaylorr)
  * progress: remove spinner.go #2759 (@ttaylorr)
* __Teach new flags, functionality to `git lfs ls-files`__
  * commands: teach '--all' to `git lfs ls-files` #2796 (@ttaylorr)
  * commands/ls-files: show cached, tree-less LFS objects #2795 (@ttaylorr)
  * commands/ls-files: add --include, --exclude #2793 (@ttaylorr)
  * commands/ls-files: add '--size' flag #2764 (@ttaylorr)
* __Add new flags, functionality to `git lfs migrate`__
  * commands/migrate: support '^'-prefix refspec in arguments #2785 (@ttaylorr)
  * commands/migrate: add '--skip-fetch' for offline migrations #2738 (@ttaylorr)
  * git: prefer sending revisions over STDIN than arguments #2739 (@ttaylorr)
* __Release to new operating systems__
  * release lfs for ubuntu/artful too #2704 (@technoweenie)
  * Adding Mint Sylvia to packagecloud.rb script #2829 (@yfronto)
* __New functionality in package `lfsapi`__
  * NTLM authentication with SSPI on windows #2871 (@stffabi)
  * lfsapi/auth: teach DoWithAuth to respect http.extraHeaders #2733 (@ttaylorr)
  * add support for url-specific proxies #2651 (@technoweenie)
* __Code cleanup in git.Config, package `localstorage`__
  * Tracked remote #2700 (@technoweenie)
  * Replace git.Config #2692 (@technoweenie)
  * Replace localstorage #2689 (@technoweenie)
  * Remove last global config #2687 (@technoweenie)
  * Git config refactor #2676 (@technoweenie)

### Bugs

* all: fix 32-bit alignment issues with `sync/atomic` #2883 (@ttaylorr)
* all: memory alignment issues on 32-bit systems. #2880 (@jeffreydwalter)
* command/migrate: don't migrate remote references in bare repositories #2769 (@ttaylorr)
* commands/ls-files: behave correctly before initial commit #2794 (@ttaylorr)
* commands/migrate: allow for ambiguous references in migrations #2734 (@ttaylorr)
* commands: fill in missing printf arg #2678 (@technoweenie)
* config: Add `lfs.locksverify` to safe keys. #2797 (@b4mboo)
* don't replace pointers with objects if clean filter is not configured #2626 (@technoweenie)
* fsck: attach a filter to exclude unfetched items from fsck #2847 (@larsxschneider)
* git/githistory: copy entries from cache, elsewhere #2884 (@ttaylorr)
* git/githistory: migrate annotated tags correctly #2780 (@ttaylorr)
* git/odb: don't print extra newline after commit message #2784 (@ttaylorr)
* git/odb: extract identifiers from commits verbatim #2751 (@wsprent)
* git/odb: implement parsing for annotated `*Tag`'s #2778 (@ttaylorr)
* git/odb: retain newlines when parsing commit messages #2786 (@ttaylorr)
* lfs: PointerScanner is nil after error, so don't close #2699 (@technoweenie)
* lfsapi: Cred helper improvements #2695 (@technoweenie)
* lfsapi: retry requests changing access from none IF Auth header is empty #2621 (@technoweenie)
* prune: always prune excluded paths #2851 (@larsxschneider)
* status: fix incorrect formatting with unpushed objects #2746 (@ttaylorr)
* tasklog: don't drop updates in PercentageTask #2755 (@ttaylorr)
* test: Fix integration test early exit #2735 (@technoweenie)
* test: generate random repo names with fs-safe characters #2698 (@technoweenie)

### Misc

* all: Nitpicks #2821 (@technoweenie)
* all: introduce package 'tlog' #2747 (@ttaylorr)
* all: remove CLA #2870 (@MikeMcQuaid)
* build: Specify the embedded Windows icon as part of versioninfo.json #2770 (@sschuberth)
* config,test: Testlib no global config #2709 (@mathstuf)
* config: add PushRemote() for checking `branch.*.pushRemote` and `remote.pushDefault` first #2715 (@technoweenie)
* docs: Added documentation for git-lfs-ls-files' `*/-` output. #2719 (@bilke)
* docs: Uninstall man page improvements #2730 (@dpursehouse)
* docs: Update usage info for post-checkout #2830 (@proinsias)
* docs: add 'git lfs prune' to main man page #2849 (@larsxschneider)
* docs: use consistent casing for Git #2850 (@larsxschneider)
* git/githistory: have `*RefUpdater` hold `*odb.ObjectDatabase` reference #2779 (@ttaylorr)
* progress: move CopyCallback (& related) to package 'tools' #2749 (@ttaylorr)
* progress: move `*progressLogger` implementation to package 'tools' #2750 (@ttaylorr)
* refspec docs #2820 (@technoweenie)
* script/test: run 'go tool vet' during testing #2788 (@ttaylorr)
* tasklog: introduce `*SimpleTask` #2756 (@ttaylorr)
* test: Ignore comment attr lines #2708 (@mathstuf)
* test: Wait longer for test lfs server to start. #2716 (@QuLogic)
* test: ensure commented attr lines are ignored #2736 (@ttaylorr)
* tools/humanize: add 'FormatByteRate' to format transfer speed #2810 (@ttaylorr)
* vendor: update 'xeipuuv/gojsonpointer' #2846 (@ttaylorr)

## 2.3.4 (18 October, 2017)

### Features

* 'git lfs install' updates filters with 'skip-smudge' option #2673 (@technoweenie)

### Bugs

* FastWalkGitRepo: limit number of concurrent goroutines #2672 (@technoweenie)
* handle scenario where multiple configuration values exist in ~/.gitconfig #2659 (@shiftkey)

## 2.3.3 (9 October, 2017)

### Bugs

* invoke lfs for 'git update-index', fixing 'status' issues #2647 (@technoweenie)
* cache http credential helper output by default #2648 (@technoweenie)

## 2.3.2 (3 October, 2017)

### Features

* bump default activity timeout from 10s -> 30s #2632 (@technoweenie)

### Bugs

* ensure files are marked readonly after unlocking by ID #2642 (@technoweenie)
* add files to index with path relative to current dir #2641 (@technoweenie)
* better Netrc errors #2633 (@technoweenie)
* only use askpass if credential.helper is not configured #2637 (@technoweenie)
* convert backslash to slash when writing to .gitattributes #2625 (@technoweenie)

### Misc

* only copy req headers if there are git-configured extra headers #2622 (@technoweenie)
* update tracerx to add timestamps #2620 (@rubyist)

## 2.3.1 (27 September, 2017)

### Features

* add support for SSH_ASKPASS #2609 (@technoweenie)
* `git lfs migrate --verbose` option #2610 (@technoweenie)
* Support standalone custom transfer based on API URL prefix match #2590 (@sprohaska)

### Bugs

* Improve invalid URL error messages #2614 (@technoweenie)
* Fix double counting progress bug #2608 (@technoweenie)
* trim whitespace from GIT_ASKPASS provided passwords #2607 (@technoweenie)
* remove mmap usage in Packfile reader #2600 (@technoweenie)
* `git lfs clone`: don't fetch for unborn repositories #2598 (@shiftkey)

### Misc

* Windows Installer fixes:
  * Show proper icon in add/remove programs list #2585 (@shiftkey)
  * Make the Inno Setup installer script explicitly check for the binaries #2588 (@sschuberth)
  * Improve compile-win-installer-unsigned.bat a bit #2586 (@sschuberth)
* Update migrate docs example for multiple file types #2596 (@technoweenie)

## 2.3.0 (14 September, 2017)

Git LFS v2.3.0 includes performance optimizations for the `git-lfs-migrate(1)`
and `git-clone(1)` commands, new features, bug-fixes, and more.

This release was made possible by contributors to Git LFS. Specifically:

- @aleb: added support for "standalone" transfer agents, for using `rsync(1)`
  and similar with Git LFS.
- @bozaro: added support for custom `.git/lfs/objects` directories via the
  `lfs.storage` configuration option.
- @larsxschneider: fixed a recursive process leak when shelling out to Git,
  added new features to `git lfs ls-files`, extra information in error
  messages used for debugging, documentation changes and more.
- @mathstuf: contributed a documentation change clarifying LFS's handling of
  empty pointer files.
- @rudineirk and @andyneff: updated our release process to build packages for
  fedora/26.
- @ssgelm: ensured that LFS is able to be released on Ubuntu Universe.

To everyone who has contributed to this or previous releases of Git LFS: Thank
you!

### Features

* git/odb/pack: improve `git lfs migrate` performance
  * git/odb/pack: introduce packed object reassembly #2550 #2551 #2552 #2553 #2554 (@ttaylorr)
  * git/odb/pack: teach packfile index entry lookups #2420 #2421 #2422 #2423 #2437 #2441 #2461 (@ttaylorr)
  * git/{odb,githistory}: don't write unchanged objects #2541 (@ttaylorr)
* commands: improve `git clone` performance with 'delay' capability #2511 #2469 #2468 #2471 #2467 #2476 #2483 (@ttaylorr)
  * commands: mark `git lfs clone` as deprecated #2526 (@ttaylorr)
* commands: enable `lfs.allowincompletepush` by default #2574 (@technoweenie)
* commands: teach '--everything' to `git lfs migrate` #2558 (@ttaylorr)
* commands: teach `git lfs ls-files` a '--debug' option #2540 (@larsxschneider)
* commands,lfs: warn on 4gb size conversion during clean #2510 #2507 #2459 (@ttaylorr)
* lfsapi/creds: teach about GIT_ASKPASS and core.askpass #2500 #2578 (@ttaylorr)
* commands/status: indicate missing objects #2438 (@ttaylorr)
* Allow using custom transfer agents directly #2429 (@aleb)
* Add `lfs.storage` parameter for overriding LFS storage location #2023 (@bozaro)
* lfsapi: enable credential caching by default #2508 (@ttaylorr)
* commands/install: teach `--manual` to `git-lfs-install(1)` #2410 (@ttaylorr)

### Bugs

* migrate: fix migrations with subdirectories in '--include' or '--exclude' #2485 (@ttaylorr)
* commands/migrate: fix hardlinking issue when different filesystem is mounted at `/tmp` #2566 (@ttaylorr)
* commands: make `git lfs migrate` fetch ref updates before migrating #2538 (@ttaylorr)
* commands: remove '--above=1mb' default from `git lfs migrate info` #2460 (@ttaylorr)
* filepathfilter: fix `HasPrefix()` when no '--include' filters present #2579 (@technoweenie)
* git/githistory/log: fix race condition with `git/githistory/log` tests #2495 (@ttaylorr)
* git/odb: fix closing object database test #2457 (@ttaylorr)
* git/githistory: only update local refs after migrations #2559 (@ttaylorr)
* locking: fix unlocking files not removing write flag #2514 (@ttaylorr)
* locks: fix unlocking files in a symlinked directory #2505 (@ttaylorr)
* commands: teach `git lfs unlock` to ignore status errs in appropriate conditions #2475 (@ttaylorr)
* git: expand `GetAttributePaths` check to include non-LFS lockables #2528 (@ttaylorr)
* fix multiple `git update-index` invocations #2531 (@larsxschneider)
* tools: fix SSH credential cacher expiration #2530 (@ttaylorr)
* lfsapi: fix read/write race condition in credential cacher #2493 (@ttaylorr)
* lfs: fix cleaning contents larger than 1024 bytes over stdin #2488 (@ttaylorr)
* fsck only scans current version of objects #2049 (@TheJare)
* progress: fix writing updates to `$GIT_LFS_PROGRESS` #2465 (@ttaylorr)
* commands/track: resolve symlinks before comparing attr paths #2463 (@ttaylorr)
* test: ensure that empty pointers are empty #2458 (@ttaylorr)
* git/githistory/log: prevent 'NaN' showing up in `*PercentageTask` #2455 (@ttaylorr)
* tq: teach Batch() API to retry itself after io.EOF's #2516 (@ttaylorr)

### Misc

* script/packagecloud: release LFS on Fedora/26 #2443 #2509 (@rudineirk, @andyneff)
* git/githistory: change "Rewriting commits" when not updating refs #2577 (@ttaylorr)
* commands: print IP addresses in error logs #2570 (@larsxschneider)
* commands: print current time in UTC to error logs #2571 (@larsxschneider)
* commands: Disable lock verification when using a standalone custom-tr… #2499 (@aleb)
* docs/man: update `git lfs migrate` documentation with EXAMPLES #2580 (@technoweenie)
* docs/man: recommend global per-host locking config #2546 (@larsxschneider)
* commands: use transfer queue's batch size instead of constant #2529 (@ttaylorr)
* add function to invoke Git with disabled LFS filters #2453 (@larsxschneider)
* config: warn on unsafe keys in `.lfsconfig` #2502 (@ttaylorr)
* glide: remove unused dependencies #2501 (@ttaylorr)
* script/build: pass '-{ld,gc}flags' to compiler, if given #2462 (@ttaylorr)
* spec: mention that an empty file is its own LFS pointer #2449 (@mathstuf)
* Update to latest version of github.com/pkg/errors #2426 (@ssgelm)
* Update gitignore to add some temp files that get created when building debs #2425 (@ssgelm)
* lfs: indent contents of `git lfs install`, `update` #2392 (@ttaylorr)
* tq: increase default `lfs.concurrenttransfers` to 8 #2506 (@ttaylorr)

## 2.2.1 (10 July, 2017)

### Bugs

* git lfs status --json only includes lfs files #2374 (@asottile)
* git/odb: remove temporary files after migration #2388 (@ttaylorr)
* git/githistory: fix hanging on empty set of commits #2383 (@ttaylorr)
* migrate: don't checkout HEAD on bare repositories #2389 (@ttaylorr)
* git/odb: prevent cross-volume link error when saving objects #2382 (@ttaylorr)
* commands: only pass --jobs to `git clone` if set #2369 (@technoweenie)

### Misc

* lfs: trace hook install, uninstall, upgrade #2393 (@ttaylorr)
* vendor: remove github.com/cheggaaa/pb #2386 (@ttaylorr)
* Use FormatBytes from git-lfs/tools/humanize instead of cheggaaa/pb #2377 (@ssgelm)


## 2.2.0 (27 June, 2017)

Git LFS v2.2.0 includes bug fixes, minor features, and a brand new `migrate`
command. The `migrate` command rewrites commits, converting large files from
Git blobs to LFS objects. The most common use case will fix a git push rejected
for having large blobs:

```
$ git push origin master
# ...
remote: error: file a.psd is 1.2 gb; this exceeds github's file size limit of 100.00 mb
to github.com:ttaylorr/demo.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@github.com:ttaylorr/demo.git'

$ git lfs migrate info
*.psd   1.2 GB   27/27 files(s)  100%

$ git lfs migrate import --include="*.psd"
migrate: Sorting commits: ..., done
migrate: Rewriting commits: 100% (810/810), done
  master        f18bb746d44e8ea5065fc779bb1acdf3cdae7ed8 -> 35b0fe0a7bf3ae6952ec9584895a7fb6ebcd498b
migrate: Updating refs: ..., done

$ git push origin
Git LFS: (1 of 1 files) 1.2 GB / 1.2 GB
# ...
To github.com:ttaylorr/demo.git
 * [new branch]      master -> master
```

The `migrate` command has detailed options described in the `git-lfs-migrate(1)`
man page. Keep in mind that this is the first pass at such a command, so we
expect there to be bugs and performance issues (especially on long git histories).
Future updates to the command will be focused on improvements to allow full
LFS transitions on large repositories.

### Features

* commands: add git-lfs-migrate(1) 'import' subcommand #2353 (@ttaylorr)
* commands: add git-lfs-migrate(1) 'info' subcommand #2313 (@ttaylorr)
* Implement status --json #2311 (@asottile)
* commands/uploader: allow incomplete pushes #2199 (@ttaylorr)

### Bugs

* Retry on timeout or temporary errors #2312 (@jakub-m)
* commands/uploader: don't verify locks if verification is disabled #2278 (@ttaylorr)
* Fix tools.TranslateCygwinPath() on MSYS #2277 (@raleksandar)
* commands/clone: add new flags since Git 2.9 #2251, #2252 (@ttaylorr)
* Make pull return non-zero error code when some downloads failed #2237 (@seth2810)
* tq/basic_download: guard against nil HTTP response #2227 (@ttaylorr)
* Bugfix: cannot push to scp style URL #2198 (@jiangxin)
* support lfs.<url>.* values where url does not include .git #2192 (@technoweenie)
* commands: fix logged error not interpolating format qualifiers #2228 (@ttaylorr)
* commands/help: print helptext to stdout for consistency with Git #2210 (@ttaylorr)

### Misc

* Minor cleanups in help index #2248 (@dpursehouse)
* Add git-lfs-lock and git-lfs-unlock to help index #2232 (@dpursehouse)
* packagecloud: add Debian 9 entry to formatted list #2211 (@ttaylorr)
* Update Xenial is to use stretch packages #2212 (@andyneff)

## 2.1.1 (19 May, 2017)

Git LFS v2.1.1 ships with bug fixes and a security patch fixing a remote code
execution vulnerability exploitable by setting a SSH remote via your
repository's `.lfsconfig` to contain the string "-oProxyCommand". This
vulnerability is only exploitable if an attacker has write access to your
repository, or you clone a repository with a `.lfsconfig` file containing that
string.

### Bugs

* Make pull return non-zero error code when some downloads failed #2245 (@seth2810, @technoweenie)
* lfsapi: support cross-scheme redirection #2243 (@ttaylorr)
* sanitize ssh options parsed from ssh:// url #2242 (@technoweenie)
* filepathfilter: interpret as .gitignore syntax #2238 (@technoweenie)
* tq/basic_download: guard against nil HTTP response #2229 (@ttaylorr)
* commands: fix logged error not interpolating format qualifiers #2230 (@ttaylorr)

### Misc

* release: backport Debian 9-related changes #2244 (@ssgelm, @andyneff, @ttaylorr)
* Add git-lfs-lock and git-lfs-unlock to help index #2240 (@dpursehouse)
* config: allow multiple environments when calling config.Unmarshal #2224 (@ttaylorr)

## 2.1.0 (28 April, 2017)

### Features

* commands/track: teach --no-modify-attrs #2175 (@ttaylorr)
* commands/status: add blob info to each entry #2070 (@ttaylorr)
* lfsapi: improve HTTP request/response stats #2184 (@technoweenie)
* all: support URL-style configuration lookups (@ttaylorr)
  * commands: support URL-style lookups for `lfs.{url}.locksverify` #2162 (@ttaylorr)
  * lfsapi: support URL-style lookups for `lfs.{url}.access` #2161 (@ttaylorr)
  * lfsapi/certs: use `*config.URLConfig` to do per-host config lookup #2160 (@ttaylorr)
  * lfsapi: support for http.<url>.extraHeader #2159 (@ttaylorr)
  * config: add prefix to URLConfig type #2158 (@ttaylorr)
  * config: remove dependency on lfsapi package #2156 (@ttaylorr)
  * config: support multi-value lookup on URLConfig #2154 (@ttaylorr)
  * lfsapi: initial httpconfig type #1912 (@technoweenie, @ttaylorr)
* lfsapi,tq: relative expiration support #2130 (@ttaylorr)

### Bugs

* commands: include error in `LoggedError()` #2179 (@ttaylorr)
* commands: cross-platform log formatting to files #2178 (@ttaylorr)
* locks: cross-platform path normalization #2139 (@ttaylorr)
* commands,locking: don't disable locking for auth errors during verify #2110 (@ttaylorr)
* commands/status: show partially staged files twice #2067 (@ttaylorr)

### Misc

* all: build on Go 1.8.1 #2145 (@ttaylorr)
* Polish custom-transfers.md #2171 (@sprohaska)
* commands/push: Fix typo in comment #2170 (@sprohaska)
* config: support multi-valued config entries #2152 (@ttaylorr)
* smudge: use localstorage temp directory, not system #2140 (@ttaylorr)
* locking: send locks limit to server #2107 (@ttaylorr)
* lfs: extract `DiffIndexScanner` #2035 (@ttaylorr)
* status: use DiffIndexScanner to populate results #2042 (@ttaylorr)

## 2.0.2 (29 March, 2017)

### Features

* ssh auth and credential helper caching #2094 (@ttaylorr)
* commands,tq: specialized logging for missing/corrupt objects #2085 (@ttaylorr)
* commands/clone: install repo-level hooks after `git lfs clone` #2074
* (@ttaylorr)
* debian: Support building on armhf and arm64 #2089 (@p12tic)

### Bugs

* commands,locking: don't disable locking for auth errors during verify #2111
* (@ttaylorr)
* commands: show real error while cleaning #2096 (@ttaylorr)
* lfsapi/auth: optionally prepend an empty scheme to Git remote URLs #2092
* (@ttaylorr)
* tq/verify: authenticate verify requests if required #2084 (@ttaylorr)
* commands/{,un}track: correctly escape '#' and ' ' characters #2079 (@ttaylorr)
* tq: use initialized lfsapi.Client instances in transfer adapters #2048
* (@ttaylorr)

### Misc

* locking: send locks limit to server #2109 (@ttaylorr)
* docs: update configuration documentation #2097 #2019 #2102 (@terrorobe)
* docs: update locking API documentation #2099 #2101 (@dpursehouse)
* fixed table markdown in README.md #2095 (@ZaninAndrea)
* remove the the duplicate work #2098 (@grimreaper)

## 2.0.1 (6 March, 2017)

### Misc

* tq: fallback to `_links` if present #2007 (@ttaylorr)

## 2.0.0 (1 March, 2017)

Git LFS v2.0.0 brings a number of important bug fixes, some new features, and
a lot of internal refactoring. It also completely removes old APIs that were
deprecated in Git LFS v0.6.

### Locking

File Locking is a brand new feature that lets teams communicate when they are
working on files that are difficult to merge. Users are not able to edit or push
changes to any files that are locked by other users. While the feature has been
in discussion for a year, we are releasing a basic Locking implementation to
solicit feedback from the community.

### Transfer Queue

LFS 2.0 introduces a new Git Scanner, which walks a range of Git commits looking
for LFS objects to transfer. The Git Scanner is now asynchronous, initiating
large uploads or downloads in the Transfer Queue immediately once an LFS object
is found. Previously, the Transfer Queue waited until all of the Git commits
have been scanned before initiating the transfer. The Transfer Queue also
automatically retries failed uploads and downloads more often.

### Deprecations

Git LFS v2.0.0 also drops support for the legacy API in v0.5.0. If you're still
using LFS servers on the old API, you'll have to stick to v1.5.6.

### Features

* Mid-stage locking support #1769 (@sinbad)
* Define lockable files, make read-only in working copy #1870 (@sinbad)
* Check that files are not uncommitted before unlock #1896 (@sinbad)
* Fix `lfs unlock --force` on a missing file #1927 (@technoweenie)
* locking: teach pre-push hook to check for locks #1815 (@ttaylorr)
* locking: add `--json` flag #1814 (@ttaylorr)
* Implement local lock cache, support querying it #1760 (@sinbad)
* support for client certificates pt 2 #1893 (@technoweenie)
* Fix clash between progress meter and credential helper #1886 (@technoweenie)
* Teach uninstall cmd about --local and --system #1887 (@technoweenie)
* Add `--skip-repo` option to `git lfs install` & use in tests #1868 (@sinbad)
* commands: convert push, pre-push to use async gitscanner #1812 (@ttaylorr)
* tq: prioritize transferring retries before new items #1758 (@ttaylorr)

### Bugs

* ensure you're in the correct directory when installing #1793 (@technoweenie)
* locking: make API requests relative to repository, not root #1818 (@ttaylorr)
* Teach 'track' about CRLF #1914 (@technoweenie)
* Teach 'track' how to handle empty lines in .gitattributes #1921 (@technoweenie)
* Closing stdout pipe before function return #1861 (@monitorjbl)
* Custom transfer terminate #1847 (@sinbad)
* Fix Install in root problems #1727 (@technoweenie)
* cat-file batch: read all of the bytes #1680 (@technoweenie)
* Fixed file paths on cygwin. #1820, #1965 (@creste, @ttaylorr)
* tq: decrement uploaded bytes in basic_upload before retry #1958 (@ttaylorr)
* progress: fix never reading bytes with sufficiently small files #1955 (@ttaylorr)
* tools: fix truncating string fields between balanced quotes in GIT_SSH_COMMAND #1962 (@ttaylorr)
* commands/smudge: treat empty pointers as empty files #1954 (@ttaylorr)

### Misc

* all: build using Go 1.8 #1952 (@ttaylorr)
* Embed the version information into the Windows executable #1689 (@sschuberth)
* Add more meta-data to the Windows installer executable #1752 (@sschuberth)
* docs/api: object size must be positive #1779 (@ttaylorr)
* build: omit DWARF tables by default #1937 (@ttaylorr)
* Add test to prove set operator [] works in filter matching #1768 (@sinbad)
* test: add ntlm integration test #1840 (@technoweenie)
* lfs/tq: completely remove legacy support #1686 (@ttaylorr)
* remove deprecated features #1679 (@technoweenie)
* remove legacy api support #1629 (@technoweenie)

## 1.5.6 (16 February, 2017)

## Bugs

* Spool malformed pointers to avoid deadlock #1932 (@ttaylorr)

## 1.5.5 (12 January, 2017)

### Bugs

* lfs: only buffer first 1k when creating a CleanPointerError #1856 (@ttaylorr)

## 1.5.4 (27 December, 2016)

### Bugs

* progress: guard negative padding width, panic in `strings.Repeat` #1807 (@ttaylorr)
* commands,lfs: handle malformed pointers #1805 (@ttaylorr)

### Misc

* script/packagecloud: release LFS on fedora/25 #1798 (@ttaylorr)
* backport filepathfilter to v1.5.x #1782 (@technoweenie)

## 1.5.3 (5 December, 2016)

### Bugs

* Support LFS installations at filesystem root #1732 (@technoweenie)
* git: parse filter process header values containing '=' properly #1733 (@larsxschneider)
* Fix SSH endpoint parsing #1738 (@technoweenie)

### Misc

* build: release on Go 1.7.4 #1741 (@ttaylorr)

## 1.5.2 (22 November, 2016)

### Features

* Release LFS on Fedora 24 #1685 (@technoweenie)

### Bugs

* filter-process: fix reading 1024 byte files #1708 (@ttaylorr)
* Support long paths on Windows #1705 (@technoweenie)

### Misc

* filter-process: exit with error if we detect an unknown command from Git #1707 (@ttaylorr)
* vendor: remove contentaddressable lib #1706 (@technoweenie)

## 1.5.1 (18 November, 2016)

### Bugs

* cat-file --batch parser errors on non-lfs git blobs #1680 (@technoweenie)

## 1.5.0 (17 November, 2016)

### Features

* Filter Protocol Support #1617 (@ttaylorr, @larsxschneider)
* Fast directory walk #1616 (@sinbad)
* Allow usage of proxies even when contacting localhost #1605 (@chalstrick)

### Bugs

* start reading off the Watch() channel before sending any input #1671 (@technoweenie)
* wait for remote ref commands to exit before returning #1656 (@jjgod, @technoweenie)

### Misc

* rewrite new catfilebatch implementation for upcoming gitscanner pkg #1650 (@technoweenie)
* refactor testutils.FileInput so it's a little more clear #1666 (@technoweenie)
* Update the lfs track docs #1642 (@technoweenie)
* Pre push tracing #1638 (@technoweenie)
* Remove `AllGitConfig()` #1634 (@technoweenie)
* README: set minimal required Git version to 1.8.5 #1636 (@larsxschneider)
* 'smudge --info' is deprecated in favor of 'ls-files' #1631 (@technoweenie)
* travis-ci: test GitLFS with ancient Git version #1626 (@larsxschneider)

## 1.4.4 (24 October, 2016)

### Bugs

* transfer: more descriptive "expired at" errors #1603 (@ttaylorr)
* commands,lfs/tq: Only send unique OIDs to the Transfer Queue #1600 (@ttaylorr)
* Expose the result message in case of an SSH authentication error #1599 (@sschuberth)

### Misc

* AppVeyor: Do not build branches with open pull requests #1594 (@sschuberth)
* Update .mailmap #1593 (@dpursehouse)

## 1.4.3 (17 October, 2016)

### Bugs

* lfs/tq: use extra arguments given to tracerx.Printf #1583 (@ttaylorr)
* api: correctly print legacy API warning to Stderr #1582 (@ttaylorr)

### Misc

* Test storage retries #1585 (@ttaylorr)
* Test legacy check retries behavior #1584 (@ttaylorr)
* docs: Fix a link to the legacy API #1579 (@sschuberth)
* Add a .mailmap file #1577 (@sschuberth)
* Add a large wizard image to the Windows installer #1575 (@sschuberth)
* Appveyor badge #1574 (@ttaylorr)

## 1.4.2 (10 October, 2016)

v1.4.2 brings a number of bug fixes and usability improvements to LFS. This
release also adds support for multiple retries within the transfer queue, making
transfers much more reliable. To enable this feature, see the documentation for
`lfs.transfer.maxretries` in `git-lfs-config(5)`.

We'd also like to extend a special thank-you to @sschuberth who undertook the
process of making LFS's test run on Windows through AppVeyor. Now all pull
requests run tests on macOS, Linux, and Windows.

### Features

* lfs: warn on usage of the legacy API #1564 (@ttaylorr)
* use filepath.Clean() when comparing filenames to include/exclude patterns #1565 (@technoweenie)
* lfs/transfer_queue: support multiple retries per object #1505, #1528, #1535, #1545 (@ttaylorr)
* Automatically upgrade old filters instead of requiring —force #1497 (@sinbad)
* Allow lfs.pushurl in .lfsconfig #1489 (@technoweenie)

### Bugs

* Use "sha256sum" on Windows  #1566 (@sschuberth)
* git: ignore non-root wildcards #1563 (@ttaylorr)
* Teach status to recognize multiple files with identical contents #1550 (@ttaylorr)
* Status initial commit #1540 (@sinbad)
* Make path comparison robust against Windows short / long path issues #1523 (@sschuberth)
* Allow fetch to run without a remote configured #1507 (@sschuberth)

### Misc

* travis: run tests on Go 1.7.1 #1568 (@ttaylorr)
* Enable running tests on AppVeyor CI #1567 (@sschuberth)
* Travis: Only install git if not installed yet #1557 (@sschuberth)
* Windows test framework fixes #1522 (@sschuberth)
* Simplify getting the absolute Git root directory #1518 (@sschuberth)
* Add icons to the Windows installer #1504 (@sschuberth)
* docs/man: reference git-lfs-pointer(1) in clean documentation #1503 (@ttaylorr)
* Make AppVeyor CI for Windows work again #1506 (@sschuberth)
* commands: try out RegisterCommand() #1495 (@technoweenie)

## 1.4.1 (26 August, 2016)

### Features

* retry if file download failed #1454 (@larsxschneider)
* Support wrapped clone in current directory #1478 (@ttaylorr)

### Misc

* Test `RetriableReader` #1482 (@ttaylorr)

## 1.4.0 (19 August, 2016)

### Features

* Install LFS at the system level when packaged #1460 (@javabrett)
* Fetch remote urls #1451 (@technoweenie)
* add object Authenticated property #1452 (@technoweenie)
* add support for `url.*.insteadof` in git config #1117, #1443 (@artagnon, @technoweenie)

### Bugs

* fix --include bug when multiple files have same lfs content #1458 (@technoweenie)
* check the git version is ok in some key commands #1461 (@technoweenie)
* fix duplicate error reporting #1445, #1453 (@dpursehouse, @technoweenie)
* transfer/custom: encode "event" as lowercase #1441 (@ttaylorr)

### Misc

* docs/man: note GIT_LFS_PROGRESS #1469 (@ttaylorr)
* Reword the description of HTTP 509 status #1467 (@dpursehouse)
* Update fetch include/exclude docs for pattern matching #1455 (@ralfthewise)
* config-next: API changes to the `config` package #1425 (@ttaylorr)
* errors-next: Contextualize error messages #1463 (@ttaylorr, @technoweenie)
* scope commands to not leak instances of themselves #1434 (@technoweenie)
* Transfer manifest #1430 (@technoweenie)

## 1.3.1 (2 August 2016)

### Features

* lfs/hook: teach `lfs.Hook` about `core.hooksPath` #1409 (@ttaylorr)

### Bugs

* distinguish between empty include/exclude paths #1411 (@technoweenie)
* Fix sslCAInfo config lookup when host in config doesn't have a trailing slash #1404 (@dakotahawkins)

### Misc

* Use commands.Config instead of config.Config #1390 (@technoweenie)

## 1.3.0 (21 July 2016)

### Features

* use proxy from git config #1173, #1358 (@jonmagic, @LizzHale, @technoweenie)
* Enhanced upload/download of LFS content: #1265 #1279 #1297 #1303 #1367 (@sinbad)
  * Resumable downloads using HTTP range headers
  * Resumable uploads using [tus.io protocol](http://tus.io)
  * Pluggable [custom transfer adapters](https://github.com/git-lfs/git-lfs/blob/master/docs/custom-transfers.md)
* In git 2.9+, run "git lfs pull" in submodules after "git lfs clone" #1373 (@sinbad)
* cmd,doc,test: teach `git lfs track --{no-touch,verbose,dry-run}` #1344 (@ttaylorr)
* ⏳ Retry transfers with expired actions #1350 (@ttaylorr)
* Safe track patterns #1346 (@ttaylorr)
* Add checkout --unstaged flag #1262 (@orivej)
* cmd/clone: add include/exclude via flags and config #1321 (@ttaylorr)
* Improve progress reporting when files skipped #1296 (@sinbad)
* Experimental file locking commands #1236, #1259, #1256, #1386 (@ttaylorr)
* Implement support for GIT_SSH_COMMAND #1260 (@pdf)
* Recognize include/exclude filters from config #1257 (@ttaylorr)

### Bugs

* Fix bug in Windows installer under Win32. #1200 (@teo-tsirpanis)
* Updated request.GetAuthType to handle multi-value auth headers #1379 (@VladimirKhvostov)
* Windows fixes #1374 (@sinbad)
* Handle artifactory responses #1371 (@ttaylorr)
* use `git rev-list --stdin` instead of passing each remote ref #1359 (@technoweenie)
* docs/man: move "logs" subcommands from OPTIONS to COMMANDS #1335 (@ttaylorr)
* test/zero-len: update test for git v2.9.1 #1369 (@ttaylorr)
* Unbreak building httputil on OpenBSD #1360 (@jasperla)
* WIP transferqueue race fix #1255 (@technoweenie)
* Safety check to `comands.requireStdin` #1349 (@ttaylorr)
* Removed CentOS 5 from dockers. Fixed #1295. #1298 (@javabrett)
* Fix 'git lfs fetch' with a sha1 ref #1323 (@omonnier)
* Ignore HEAD ref when fetching with --all #1310 (@ttaylorr)
* Return a fully remote ref to reduce chances of ref clashes #1248 (@technoweenie)
* Fix reporting of `git update-index` errors in `git lfs checkout` and `git lfs pull` #1400 (@technoweenie)

### Misc

* Added Linux Mint Sarah to package cloud script #1384 (@andyneff)
* travis-ci: require successful tests against upcoming Git core release #1372 (@larsxschneider)
* travis-ci: add a build job to test against upcoming versions of Git #1361 (@larsxschneider)
* Create Makefiles for building with gccgo #1222 (@zeldin)
* README: add @ttaylorr to core team #1332 (@ttaylorr)
* Enforced a minimum gem version of 1.0.4 for packagecloud-ruby #1292 (@javabrett)
* I think this should be "Once installed" and not "One installed", but … #1305 (@GabLeRoux)
* script/test: propagate extra args to go test #1324 (@omonnier)
* Add `lfs.basictransfersonly` option to disable non-basic transfer adapters #1299 (@sinbad)
* Debian build vendor test excludes #1291 (@javabrett)
* gitignore: ignore lfstest-\* files #1271 (@ttaylorr)
* Disable gojsonschema test, causes failures when firewalls block it #1274 (@sinbad)
* test: use noop credential helper for auth tests #1267 (@ttaylorr)
* get git tests passing when run outside of repository #1229 (@technoweenie)
* Package refactor no.1 #1226 (@sinbad)
* vendor: vendor dependencies in vendor/ using Glide #1243 (@ttaylorr)

## 1.2.1 (2 June 2016)

### Features

* Add missing config details to `env` command #1217 (@sinbad)
* Allow smudge filter to return 0 on download failure #1213 (@sinbad)
* Add `git lfs update --manual` option & promote it on hook install fail #1182 (@sinbad)
* Pass `git lfs clone` flags through to `git clone` correctly, respect some options #1160 (@sinbad)

### Bugs

* Clean trailing `/` from include/exclude paths #1278 (@ttaylorr)
* Fix problems with user prompts in `git lfs clone` #1185 (@sinbad)
* Fix failure to return non-zero exit code when lfs install/update fails to install hooks #1178 (@sinbad)
* Fix missing man page #1149 (@javabrett)
* fix concurrent map read and map write #1179 (@technoweenie)

### Misc

* Allow additional fields on request & response schema #1276 (@sinbad)
* Fix installer error on win32. #1198 (@teo-tsirpanis)
* Applied same -ldflags -X name value -> name=value fix #1193 (@javabrett)
* add instructions to install from MacPorts #1186 (@skymoo)
* Add xenial repo #1170 (@graingert)

## 1.2.0 (14 April 2016)

### Features

* netrc support #715 (@rubyist)
* `git lfs clone` command #988 (@sinbad)
* Support self-signed certs #1067 (@sinbad)
* Support sslverify option for specific hosts #1081 (@sinbad)
* Stop transferring duplicate objects on major push or fetch operations on multiple refs. #1128 (@technoweenie)
* Touch existing git tracked files when tracked in LFS so they are flagged as modified #1104 (@sinbad)
* Support for git reference clones #1007 (@jlehtnie)

### Bugs

* Fix clean/smudge filter string for files starting with - #1083 (@epriestley)
* Fix silent failure to push LFS objects when ref matches a filename in the working copy #1096 (@epriestley)
* Fix problems with using LFS in symlinked folders #818 (@sinbad)
* Fix git lfs push silently misbehaving on ambiguous refs; fail like git push instead #1118 (@sinbad)
* Whitelist `lfs.*.access` config in local ~/.lfsconfig #1122 (@rjbell4)
* Only write the encoded pointer information to Stdout #1105 (@sschuberth)
* Use hardcoded auth from remote or lfs config when accessing the storage api #1136 (@technoweenie, @jonmagic)
* SSH should be called more strictly with command as one argument #1134 (@sinbad)

## 1.1.2 (1 March, 2016)

* Fix Base64 issues with `?` #989 (@technoweenie)
* Fix zombie git proc issue #1012 (@rlaakkol)
* Fix problems with files containing unicode characters #1016 (@technoweenie)
* Fix panic in `git cat-file` parser #1006 (@technoweenie)
* Display error messages in non-fatal errors #1028 #1039 #1042 (@technoweenie)
* Fix concurrent map access in progress meter (@technoweenie)

## 1.1.1 (4 February, 2016)

### Features

* Add copy-on-write support for Linux BTRFS filesystem #952 (@bozaro)
* convert `git://` remotes to LFS servers automatically #964 (@technoweenie)
* Fix `git lfs track` handling of absolute paths. #975  (@technoweenie)
* Allow tunable http client timeouts #977 (@technoweenie)

### Bugs

* Suppress git config warnings for non-LFS keys #861 (@technoweenie)
* Fix fallthrough when `git-lfs-authenticate` returns an error #909 (@sinbad)
* Fix progress bar issue #883 (@pokehanai)
* Support `remote.name.pushurl` config #949 (@sinbad)
* Fix handling of `GIT_DIR` and `GIT_WORK_TREE` #963, #971 (@technoweenie)
* Fix handling of zero length files #966 (@nathanhi)
* Guard against invalid remotes passed to `push` and `pre-push` #974 (@technoweenie)
* Fix race condition in `git lfs pull` #972 (@technoweenie)

### Extra

* Add server API test tool #868 (@sinbad)
* Redo windows installer with innosetup #875 (@strich)
* Pre-built packages are built with Go v1.5.3

## 1.1.0 (18 November, 2015)

* NTLM auth support #820 (@WillHipschman, @technoweenie)
* Add `prune` command #742 (@sinbad)
* Use .lfsconfig instead of .gitconfig #837 (@technoweenie)
* Rename "init" command #838 (@technoweenie)
* Raise error if credentials are needed #842 (@technoweenie)
* Support git repos in symlinked directories #818 (@sinbad, @difro, @jiangxin)
* Fix "git lfs env" to show correct SSH remote info #828 (@jiangxin)

## 1.0.2 (28 October, 2015)

* Fix issue with 'git lfs smudge' and the batch API. #795 (@technoweenie)
* Fix race condition in the git scanning code. #801 (@technoweenie)

## 1.0.1 (23 October, 2015)

* Downcase git config keys (prevents Auth loop) #690 (@WillHipschman)
* Show more info for unexpected http responses #710 (@rubyist)
* Use separate stdout/stderr buffers for `git-lfs-authenticate` #718 (@bozaro)
* Use LoggedError instead of Panic if update-index fails in checkout #735 (@sinbad)
* `smudge` command exits with non-zero if the download fails #732 (@rubyist)
* Use `git rev-parse` to find the git working dir #692 (@sinbad)
* Improved default remote behaviour & validation for fetch/pull #713 (@sinbad)
* Make fetch return error code when 1+ downloads failed #734 (@sinbad)
* Improve lfs.InRepo() detection in `init`/`update` #756 (@technoweenie)
* Teach smudge to use the batch api #711 (@rubyist)
* Fix not setting global attribute when needed to b/c of local state #765 (@sinbad)
* Fix clone fail when fetch is excluded globally #770 (@sinbad)
* Fix for partial downloads problem #763 (@technoweenie)
* Get integration tests passing on Windows #771 (@sinbad)

### Security

* Whitelist the valid keys read from .gitconfig #760 (@technoweenie)

This prevents unsafe git configuration values from being used by Git LFS.

## v1.0 (1 October, 2015)

* Manual reference is integrated into the "help" options #665 @sinbad
* Fix `ls-files` when run from an empty repository #668 @Aorjoa
* Support listing duplicate files in `ls-files` #681 @Aorjoa @technoweenie
* `update` and `init` commands can install the pre-push hook in bare repositories #671 @technoweenie
* Add `GIT_LFS_SKIP_SMUDGE` and `init --skip-smudge` #679 @technoweenie

## v0.6.0 (10 September, 2015)

This is the first release that uses the new Batch API by default, while still
falling back to the Legacy API automatically. Also, new fetch/checkout/push
commands have been added.

Run `git lfs update` in any local repositories to make sure all config settings
are updated.

### Fetch

* Rename old `git lfs fetch` command to `git lfs pull`. #527 (@sinbad)
* Add `git lfs checkout` #527 #543 #551 #566 (@sinbad)
* Add `git lfs fetch` for _just_ downloading objects. #527 (@sinbad)
  * Add `remote` arg, and default to tracking remote instead of "origin". #583 (@sinbad)
  * Support fetching multiple refs #542 (@sinbad)
  * Add `--include` and `--exclude` flag for `git lfs fetch` #573 (@sinbad)
  * Add `--recent` flag for downloading recent files outside of the current
    checkout. #610 (@sinbad)
  * Add `--all` option for download all objects from the server. #633 (@sinbad)
* Fix error handling while `git update-index` is running. #570 (@rubyist)

See [git-lfs-fetch(1)](https://github.com/git-lfs/git-lfs/blob/v0.6.0/docs/man/git-lfs-fetch.1.ronn),
[git-lfs-checkout(1)](https://github.com/git-lfs/git-lfs/blob/v0.6.0/docs/man/git-lfs-checkout.1.ronn),
and [git-lfs-pull(1)](https://github.com/git-lfs/git-lfs/blob/v0.6.0/docs/man/git-lfs-pull.1.ronn)
 for details.

### Push

* Support pushing multiple branches in the pre-push hook. #635 (@sinbad)
* Fix pushing objects from a branch that's not HEAD. #608 (@sinbad)
* Check server for objects before failing push because local is missing. #581 (@sinbad)
* Filter out commits from remote refs when pushing. #578 (@billygor)
* Support pushing all objects to the server, regardless of the remote ref. #646 (@technoweenie)
* Fix case where pre-push git hook exits with 0. #582 (@sinbad)

See [git-lfs-push(1)](https://github.com/git-lfs/git-lfs/blob/v0.6.0/docs/man/git-lfs-push.1.ronn) for details.

### API Clients

* Fix some race conditions in the Batch API client. #577 #637 (@sinbad, @rubyist)
* Support retries in the Batch API client. #595 (@rubyist)
* Fix hanging batch client in certain error conditions. #594 (@rubyist)
* Treat 401 responses as errors in the Legacy API client. #634 (@rubyist)
* Fix bug in the Legacy API client when the object already exists on the server. #572 (@billygor)

### Credentials

* Fix how git credentials are checked in certain edge cases. #611 #650 #652 (@technoweenie)
* Send URI user to git credentials. #626 (@sinbad)
* Support git credentials with useHttpPath enabled. #554 (@clareliguori)

### Installation

* Docker images and scripts for building and testing linux packages. #511 #526 #555 #603 (@andyneff, @ssgelm)
* Create Windows GUI installer. #642 (@technoweenie)
* Binary releases use Go 1.5, which includes fix for Authorization when the
  request URL includes just the username. [golang/go#11399](https://github.com/golang/go/issues/11399)

### Misc

* Documented Git config values used by Git LFS in [git-lfs-config(5)](https://github.com/git-lfs/git-lfs/blob/v0.6.0/docs/man/git-lfs-config.5.ronn). #610 (@sinbad)
* Experimental support for Git worktrees (in Git 2.5+) #546 (@sinbad)
* Experimental extension support. #486 (@ryansimmen)

## v0.5.4 (30 July, 2015)

* Ensure `git lfs uninit` cleans your git config thoroughly. #530 (@technoweenie)
* Fix issue with asking `git-credentials` for auth details after getting them
from the SSH command. #534 (@technoweenie)

## v0.5.3 (23 July, 2015)

* `git lfs fetch` bugs #429 (@rubyist)
* Push can crash on 32 bit architectures #450 (@rubyist)
* Improved SSH support #404, #464 (@sinbad, @technoweenie)
* Support 307 redirects with relative url #442 (@sinbad)
* Fix `init` issues when upgrading #446 #451 #452 #465 (@technoweenie, @rubyist)
* Support chunked Transfer-Encoding #386 (@ryansimmen)
* Fix issue with pushing deleted objects #461 (@technoweenie)
* Teach `git lfs push` how to send specific objects #449 (@larsxschneider)
* Update error message when attempting to push objects that don't exist in `.git/lfs/objects` #447 (@technoweenie)
* Fix bug in HTTP client when response body is nil #472 #488 (@rubyist, @technoweenie)
* `-crlf` flag in gitattributes is deprecated #475 (@technoweenie)
* Improvements to the CentOS and Debian build and package scripts (@andyneff, @ssgelm)

## v0.5.2 (19 June, 2015)

* Add `git lfs fetch` command for downloading objects. #285 (@rubyist)
* Fix `git lfs track` issues when run outside of a git repository #312, #323 (@michael-k, @Aorjoa)
* Fix `git lfs track` for paths with spaces in them #327 (@technoweenie)
* Fix `git lfs track` by writing relative paths to .gitattributes #356 (@michael-k)
* Fix `git lfs untrack` so it doesn't remove entries incorrectly from .gitattributes #398 (@michael-k)
* Fix `git lfs clean` bug with zero length files #346 (@technoweenie)
* Add `git lfs fsck` #373 (@zeroshirts, @michael-k)
* The Git pre-push warns if Git LFS is not installed #339 (@rubyist)
* Fix Content-Type header sent by the HTTP client #329 (@joerg)
* Improve performance tracing while scanning refs #311 (@michael-k)
* Fix detection of LocalGitDir and LocalWorkingDir #312 #354 #361 (@michael-k)
* Fix inconsistent file mode bits for directories created by Git LFS #364 (@michael-k)
* Optimize shell execs #377, #382, #391 (@bozaro)
* Collect HTTP transfer stats #366, #400 (@rubyist)
* Support GIT_DIR and GIT_WORK_TREE #370 (@michael-k)
* Hide Git application window in Windows #381 (@bozaro)
* Add support for configured URLs containing credentials per RFC1738 #408 (@ewbankkit, @technoweenie)
* Add experimental support for batch API calls #285 (@rubyist)
* Improve linux build instructions for CentOS and Debian. #299 #309 #313 #332 (@jsh, @ssgelm, @andyneff)

## v0.5.1 (30 April, 2015)

* Fix Windows install.bat script.  #223 (@PeterDaveHello)
* Fix bug where `git lfs clean` will clean Git LFS pointers too #271 (@technoweenie)
* Better timeouts for the HTTP client #215 (@Mistobaan)
* Concurrent uploads through `git lfs push` #258 (@rubyist)
* Fix `git lfs smudge` behavior with zero-length file in `.git/lfs/objects` #267 (@technoweenie)
* Separate out pre-push hook behavior from `git lfs push` #263 (@technoweenie)
* Add diff/merge properties to .gitattributes #265 (@technoweenie)
* Respect `GIT_TERMINAL_PROMPT ` #257 (@technoweenie)
* Fix CLI progress bar output #185 (@technoweenie)
* Fail fast in `clean` and `smudge` commands when run without STDIN #264 (@technoweenie)
* Fix shell quoting in pre-push hook.  #235 (@mhagger)
* Fix progress bar output during file uploads.  #185 (@technoweenie)
* Change `remote.{name}.lfs_url` to `remote.{name}.lfsurl` #237 (@technoweenie)
* Swap `git config` order.  #245 (@technoweenie)
* New `git lfs pointer` command for generating and comparing pointers #246 (@technoweenie)
* Follow optional "href" property from git-lfs-authenticate SSH command #247 (@technoweenie)
* `.git/lfs/objects` spec clarifications: #212 (@rtyley), #244 (@technoweenie)
* man page updates: #228 (@mhagger)
* pointer spec clarifications: #246 (@technoweenie)
* Code comments for the untrack command: #225 (@thekafkaf)

## v0.5.0 (10 April, 2015)

* Initial public release


================================================
FILE: CODE-OF-CONDUCT.md
================================================
# Git LFS Code of Conduct

This code of conduct outlines our expectations for participants within the Git LFS community, as well as steps to reporting unacceptable behavior. We are committed to providing a welcoming and inspiring community for all and expect our code of conduct to be honored. Anyone who violates this code of conduct may be banned from the community.

Our open source community strives to:

* **Be friendly and patient.**
* **Be welcoming**: We strive to be a community that welcomes and supports people of all backgrounds and identities. This includes, but is not limited to members of any race, ethnicity, culture, national origin, colour, immigration status, social and economic class, educational level, sex, sexual orientation, gender identity and expression, age, size, family status, political belief, religion, and mental and physical ability.
* **Be considerate**: Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language.
* **Be respectful**:  Not all of us will agree all the time, but disagreement is no excuse for poor behavior and poor manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one.
* **Be careful in the words that we choose**: we are a community of professionals, and we conduct ourselves professionally. Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behavior aren't acceptable.
* **Try to understand why we disagree**: Disagreements, both social and technical, happen all the time. It is important that we resolve disagreements and differing views constructively. Remember that we’re different. The strength of our community comes from its diversity, people from a wide range of backgrounds. Different people have different perspectives on issues. Being unable to understand why someone holds a viewpoint doesn’t mean that they’re wrong. Don’t forget that it is human to err and blaming each other doesn’t get us anywhere. Instead, focus on helping to resolve issues and learning from mistakes.

## Definitions

Harassment includes, but is not limited to:

- Offensive comments related to gender, gender identity and expression, sexual orientation, disability, mental illness, neuro(a)typicality, physical appearance, body size, race, age, regional discrimination, political or religious affiliation
- Unwelcome comments regarding a person’s lifestyle choices and practices, including those related to food, health, parenting, drugs, and employment
- Deliberate misgendering. This includes deadnaming or persistently using a pronoun that does not correctly reflect a person's gender identity. You must address people by the name they give you when not addressing them by their username or handle
- Physical contact and simulated physical contact (eg, textual descriptions like “*hug*” or “*backrub*”) without consent or after a request to stop
- Threats of violence, both physical and psychological
- Incitement of violence towards any individual, including encouraging a person to commit suicide or to engage in self-harm
- Deliberate intimidation
- Stalking or following
- Harassing photography or recording, including logging online activity for harassment purposes
- Sustained disruption of discussion
- Unwelcome sexual attention, including gratuitous or off-topic sexual images or behaviour
- Pattern of inappropriate social contact, such as requesting/assuming inappropriate levels of intimacy with others
- Continued one-on-one communication after requests to cease
- Deliberate “outing” of any aspect of a person’s identity without their consent except as necessary to protect others from intentional abuse
- Publication of non-harassing private communication

Our open source community prioritizes marginalized people’s safety over privileged people’s comfort. We will not act on complaints regarding:

- ‘Reverse’ -isms, including ‘reverse racism,’ ‘reverse sexism,’ and ‘cisphobia’
- Reasonable communication of boundaries, such as “leave me alone,” “go away,” or “I’m not discussing this with you”
- Refusal to explain or debate social justice concepts
- Communicating in a ‘tone’ you don’t find congenial
- Criticizing racist, sexist, cissexist, or otherwise oppressive behavior or assumptions

### Diversity Statement

We encourage everyone to participate and are committed to building a community for all. Although we will fail at times, we seek to treat everyone both as fairly and equally as possible. Whenever a participant has made a mistake, we expect them to take responsibility for it. If someone has been harmed or offended, it is our responsibility to listen carefully and respectfully, and do our best to right the wrong.

Although this list cannot be exhaustive, we explicitly honor diversity in age, gender, gender identity or expression, culture, ethnicity, language, national origin, political beliefs, profession, race, religion, sexual orientation, socioeconomic status, and technical ability. We will not tolerate discrimination based on any of the protected
characteristics above, including participants with disabilities.

### Reporting Issues

If you experience or witness unacceptable behavior—or have any other concerns—please report it by contacting us via opensource@github.com. All reports will be handled with discretion. In your report please include:

- Your contact information.
- Names (real, nicknames, or pseudonyms) of any individuals involved. If there are additional witnesses, please
include them as well. Your account of what occurred, and if you believe the incident is ongoing. If there is a publicly available record (e.g. a mailing list archive or a public IRC logger), please include a link.
- Any additional information that may be helpful.

After filing a report, a representative will contact you personally, review the incident, follow up with any additional questions, and make a decision as to how to respond. If the person who is harassing you is part of the response team, they will recuse themselves from handling your incident. If the complaint originates from a member of the response team, it will be handled by a different member of the response team. We will respect confidentiality requests for the purpose of protecting victims of abuse.

### Attribution & Acknowledgements

We all stand on the shoulders of giants across many open source communities.  We'd like to thank the communities and projects that established code of conducts and diversity statements as our inspiration:

* [Django](https://www.djangoproject.com/conduct/reporting/)
* [Python](https://www.python.org/community/diversity/)
* [Ubuntu](http://www.ubuntu.com/about/about-ubuntu/conduct)
* [Contributor Covenant](http://contributor-covenant.org/)
* [Geek Feminism](http://geekfeminism.org/about/code-of-conduct/)
* [Citizen Code of Conduct](http://citizencodeofconduct.org/)


================================================
FILE: CONTRIBUTING.md
================================================
## Contributing to Git Large File Storage

Hi there! We're thrilled that you'd like to contribute to this project. Your
help is essential for making it the best it can be.

Contributions to this project are [released](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license) to the public under the [project's open source license](LICENSE.md).

This project adheres to the [Open Code of Conduct](./CODE-OF-CONDUCT.md). By participating, you are expected to uphold this code.

## Feature Requests

Feature requests are welcome, but will have a much better chance of being
accepted if they meet the first principles for the project. Git LFS is intended
for end users, not Git experts. It should fit into the standard workflow as
much as possible, and require little client configuration.

* Large objects are pushed to Git LFS servers during git push.
* Large objects are downloaded during git checkout.
* Git LFS servers are linked to Git remotes by default. Git hosts can support
users without requiring them to set up anything extra. Users can access
different Git LFS servers like they can with different Git remotes.
* Upload and download requests should use the same form of authentication built
into Git: SSH through public keys, and HTTPS through Git credential helpers.
* Git LFS servers use a JSON API designed around progressive enhancement.
Servers can simply host off cloud storage, or implement more efficient methods
of transferring data.

Since the focus for the project is on end users, we're generally hesitant about
introducing new features that make data loss easy or are prone to misuse.
However, we're not necessarily opposed to adding generally applicable
customizability or features for advanced users if they don't conflict with other
project goals.

## Project Management

The Git LFS project is managed completely through this open source project. The
[milestones][] show the high level items that are prioritized for future work.
Suggestions for major features should be submitted as a pull request that adds a
markdown file to `docs/proposals` discussing the feature. This gives the
community time to discuss it before a lot of code has been written.

[milestones]: https://github.com/git-lfs/git-lfs/milestones

The Git LFS teams mark issues and pull requests with the following labels:

* `bug` - An issue describing a bug.
* `enhancement` - An issue for a possible new feature.
* `review` - A pull request ready to be reviewed.
* `release` - A checklist issue showing items marked for an upcoming release.

## Branching strategy

In general, contributors should develop on branches based off of `main` and pull requests should be to `main`.

## Submitting a pull request

1. [Fork][] and clone the repository
1. Configure and install the dependencies: `make`
1. Make sure the tests pass on your machine: `make test`
1. Create a new branch based on `main`: `git checkout -b <my-branch-name> main`
1. Make your change, add tests, and make sure the tests still pass
1. Push to your fork and [submit a pull request][pr] from your branch to `main`
1. Pat yourself on the back and wait for your pull request to be reviewed

Here are a few things you can do that will increase the likelihood of your pull request being accepted:

* Follow the [style guide][style] where possible.
* Write tests.
* Update documentation as necessary.  Commands have [man pages](./docs/man).
* Keep your change as focused as possible. If there are multiple changes you
would like to make that are not dependent upon each other, consider submitting
them as separate pull requests.
* Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).
* Explain the rationale for your change in the pull request. You can often use
  part of a good commit message as a starting point.

## Discussions

[Our discussions](https://github.com/git-lfs/git-lfs/discussions) are the
perfect place to ask a question if you're not sure on something, provide
feedback that isn't a bug report or feature request, or learn about use cases or
best practices with Git LFS.  There's even a search box to help you see if
someone has already answered your question!

You can also check [the FAQ](https://github.com/git-lfs/git-lfs/blob/main/docs/man/git-lfs-faq.adoc)
to see if your question is well known and already has an easy answer.

## Issues

If you think you've found a bug or have an issue, we'd love to hear about it!
Here are some tips for getting your question answered as quickly as possible:

* It's helpful if your issue includes the output of `git lfs env`, plus any
  relevant information about platform or configuration (e.g., container or CI
  usage, Cygwin, WSL, or non-Basic authentication).
* Take a look at the
  [troubleshooting](https://github.com/git-lfs/git-lfs/wiki/Troubleshooting) and
  [FAQ](https://github.com/git-lfs/git-lfs/wiki/FAQ) pages on the wiki. We
  update them from time to time with information on how to track down problems.
  If it seems relevant, include any information you've learned by following
  those steps.
* If you're having problems with GitHub's server-side LFS support, it's best to
  reach out to [GitHub's support team](https://github.com/contact) to get help.
  We aren't able to address GitHub-specific issues in this project, but the
  GitHub support team will do their best to help you out.
* If you see an old issue that's closed as fixed, but you're still experiencing
  the problem on your system, please open a new issue. The problem you're seeing
  is likely different, at least in the way it works internally, and we can help
  best when we have a new issue with all the information.

## Building

### Prerequisites

Git LFS depends on having a working Go development environment.  We officially
support the latest version of Go, although we try not to break backwards
compatibility with older versions if it's possible to avoid doing so.

On RHEL etc. e.g. Red Hat Enterprise Linux Server release 7.2 (Maipo), you will need the minimum packages installed to build Git LFS:

```ShellSession
$ sudo yum install gcc
$ sudo yum install perl-Digest-SHA
```

In order to run the RPM build `rpm/build_rpms.bsh` you will also need to:

```ShellSession
$ sudo yum install ruby-devel
```

(note on an AWS instance you may first need to `sudo yum-config-manager --enable rhui-REGION-rhel-server-optional`)

### Building Git LFS

The easiest way to download Git LFS for making changes is `git clone`:

```ShellSession
$ git clone git@github.com:git-lfs/git-lfs.git
$ cd git-lfs
```

From here, run `make` to build Git LFS in the `./bin` directory. Before
submitting changes, be sure to run the Go tests and the shell integration
tests:

```ShellSession
$ make test          # runs just the Go tests
$ cd t && make test  # runs the shell tests in ./test
$ script/cibuild     # runs everything, with verbose debug output
```

## Updating 3rd party packages

1. Update `go.mod` and `go.sum`. You can ensure the latter is up-to-date by
   using Go tools instead of manually editing `go.mod` (e.g., `go get
   gopath@version`) or by running `go mod tidy` or `make go.sum`.
1. Commit the change.
1. Submit a pull request.

## Releasing

If you are the current maintainer, see
[the release howto](./docs/howto/release-git-lfs.md) for how to perform a release.

## Resources

- [Contributing to Open Source on GitHub](https://guides.github.com/activities/contributing-to-open-source/)
- [Using Pull Requests](https://help.github.com/articles/using-pull-requests/)
- [GitHub Help](https://help.github.com)

[fork]: https://github.com/git-lfs/git-lfs/fork
[pr]: https://github.com/git-lfs/git-lfs/compare
[style]: https://github.com/golang/go/wiki/CodeReviewComments


================================================
FILE: INSTALLING.md
================================================
# Installing on Linux using packagecloud

[packagecloud](https://packagecloud.io) hosts [`git-lfs` packages](https://packagecloud.io/github/git-lfs) for popular Linux distributions with apt/deb and yum/rpm based package-managers.  Installing from packagecloud is reasonably straightforward and involves two steps:

## 1. Adding the packagecloud repository

packagecloud provides scripts to automate the process of configuring the package repository on your system, importing signing-keys etc.  These scripts must be run sudo root, and you should review them first.  The scripts are:

* apt/deb repositories: https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh
* yum/rpm repositories: https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh

The scripts check your Linux distribution and version, and use those parameters to create the best repository URL.  If you are running one of the distributions listed for the latest version of Git LFS listed at [packagecloud](https://packagecloud.io/github/git-lfs) e.g., `debian/bookworm`, `el/9`, you can run the script without parameters:

apt/deb repos:
`curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash`

yum/rpm repos:
`curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | sudo bash`

If you are running a distribution which does not match exactly a repository uploaded for Git LFS, but for which there is a repository for a compatible upstream distribution, you can either run the script with some additional parameters, or run it and then manually-correct the resulting repository URLs.  See [#1074](https://github.com/git-lfs/git-lfs/issues/1074) for details.

If you are running Linux Mint 22.1 Xia, which is downstream of Ubuntu Noble and Debian Bookworm, you can run:

`curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | os=debian dist=xia sudo -E bash`

The `os` and `dist` variables passed-in will override what would be detected for your system and force the selection of the upstream distribution's repository.

You may also be able to run the following to automatically detect the dist for Ubuntu based distributions such as Pop!_OS:
```
(. /etc/lsb-release &&
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh |
sudo env os=ubuntu dist="${DISTRIB_CODENAME}" bash)
```

## 2. Installing packages

With the packagecloud repository configured for your system, you can install Git LFS:

* apt/deb: `sudo apt-get install git-lfs`
* yum/rpm: `sudo yum install git-lfs`

## A note about proxies

Several of the commands above assume internet access and use `sudo`. If your host is behind a proxy-server that is required for internet access, you may depend on environment-variables `http_proxy` or `https_proxy` being set, and these might not survive the switch to root with `sudo`, which resets environment by-default.  To get around this, you can run `sudo` with the `-E` switch, `sudo -E ...`, which retains environment variables.


================================================
FILE: LICENSE.md
================================================
MIT License

Copyright (c) 2014- GitHub, Inc. and Git LFS contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Portions of the subprocess and tools directories are copied from Go and are
under the following license:

Copyright (c) 2009,2010 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

   * Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
   * Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
   * Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Note that Git LFS uses components from other Go modules, which are under
different licenses.  See those LICENSE files for details.


================================================
FILE: Makefile
================================================
# GIT_LFS_SHA is the '--short'-form SHA1 of the current revision of Git LFS.
GIT_LFS_SHA ?= $(shell env -u GIT_TRACE git rev-parse --short HEAD)
# VERSION is the longer-form describe output of the current revision of Git LFS,
# used for identifying intermediate releases.
#
# If Git LFS is being built for a published release, VERSION and GIT_LFS_SHA
# should be identical.
VERSION ?= $(shell env -u GIT_TRACE git describe HEAD)

# PREFIX is VERSION without the leading v, for use in archive prefixes.
PREFIX ?= $(patsubst v%,git-lfs-%,$(VERSION))

# GO is the name of the 'go' binary used to compile Git LFS.
GO ?= go

# GOTOOLCHAIN is an environment variable which, when set to 'local',
# prevents Go from downloading and running non-local versions of itself.
export GOTOOLCHAIN = local

# GO_TEST_EXTRA_ARGS are extra arguments given to invocations of 'go test'.
#
# Examples include:
#
# 	make test GO_TEST_EXTRA_ARGS=-v
# 	make test GO_TEST_EXTRA_ARGS='-run TestMyExample'
GO_TEST_EXTRA_ARGS =

# BUILTIN_LD_FLAGS are the internal flags used to pass to the linker. By default
# the config.GitCommit variable is always set via this variable, and
# DWARF-stripping is enabled unless DWARF=YesPlease.
BUILTIN_LD_FLAGS =
ifneq ("$(VENDOR)","")
BUILTIN_LD_FLAGS += -X 'github.com/git-lfs/git-lfs/v3/config.Vendor=$(VENDOR)'
endif
BUILTIN_LD_FLAGS += -X github.com/git-lfs/git-lfs/v3/config.GitCommit=$(GIT_LFS_SHA)
ifneq ("$(DWARF)","YesPlease")
BUILTIN_LD_FLAGS += -s
BUILTIN_LD_FLAGS += -w
endif
# EXTRA_LD_FLAGS are given by the caller, and are passed to the Go linker after
# BUILTIN_LD_FLAGS are processed. By default the system LDFLAGS are passed.
# Note that these must be passed as a single argument to -extldflags, and
# since our LD_FLAGS variable must in turn be passed as a single argument
# to the "go build" command's -ldflags option, we enclose any system LDFLAGS
# in escaped quotes.
ifdef LDFLAGS
EXTRA_LD_FLAGS ?= -extldflags \"$(LDFLAGS)\"
endif
# LD_FLAGS is the union of the above two BUILTIN_LD_FLAGS and EXTRA_LD_FLAGS.
LD_FLAGS = $(BUILTIN_LD_FLAGS) $(EXTRA_LD_FLAGS)

# BUILTIN_GC_FLAGS are the internal flags used to pass compiler.
BUILTIN_GC_FLAGS =
# EXTRA_GC_FLAGS are the caller-provided flags to pass to the compiler.
EXTRA_GC_FLAGS =
# GC_FLAGS are the union of the above two BUILTIN_GC_FLAGS and EXTRA_GC_FLAGS.
GC_FLAGS = $(BUILTIN_GC_FLAGS) $(EXTRA_GC_FLAGS)

# ASCIIDOCTOR is the name of the 'asciidoctor' program used to generate man pages.
ASCIIDOCTOR ?= asciidoctor
# ASCIIDOCTOR_EXTRA_ARGS are extra arguments given to the $(ASCIIDOCTOR) program when invoked.
ASCIIDOCTOR_EXTRA_ARGS ?= -a reproducible

# GREP is the name of the program used for regular expression matching, or
# 'grep' if unset.
GREP ?= grep
# XARGS is the name of the program used to turn stdin into program arguments, or
# 'xargs' if unset.
XARGS ?= xargs

# GOIMPORTS is the name of the program formatter used before compiling.
GOIMPORTS ?= goimports
# GOIMPORTS_EXTRA_OPTS are the default options given to the $(GOIMPORTS)
# program.
GOIMPORTS_EXTRA_OPTS ?= -w -l

# TAR is the tar command, either GNU or BSD (libarchive) tar.
TAR ?= tar

TAR_XFORM_ARG ?= $(shell $(TAR) --version | grep -q 'GNU tar' && echo '--xform' || echo '-s')
TAR_XFORM_CMD ?= $(shell $(TAR) --version | grep -q 'GNU tar' && echo 's')

# GZIP is the "gzip" command.
GZIP ?= gzip

# CERT_SHA1 is the SHA-1 hash of the Windows code-signing cert to use.  The
# actual signature is made with SHA-256.
CERT_SHA1 ?= 30a531ed3a246d3d07a4273adaef31552bf6473a

# CERT_FILE is the PKCS#12 file holding the certificate.
CERT_FILE ?=

# CERT_PASS is the password for the certificate.  It must not contain
# double-quotes.
CERT_PASS ?=

# CERT_ARGS are additional arguments to pass when signing Windows binaries.
ifneq ("$(CERT_FILE)$(CERT_PASS)","")
CERT_ARGS ?= -f "$(CERT_FILE)" -p "$(CERT_PASS)"
else
CERT_ARGS ?= -sha1 $(CERT_SHA1)
endif

# DARWIN_KEYCHAIN_ID is the name of the keychain (with suffix) where the
# certificate is located.
DARWIN_KEYCHAIN_ID ?= lfs.keychain

export DARWIN_DEV_USER DARWIN_DEV_PASS DARWIN_DEV_TEAM

# SOURCES is a listing of all .go files in this and child directories, excluding
# that in vendor.
SOURCES = $(shell find . -type f -name '*.go' | grep -v vendor)

# MSGFMT is the GNU gettext msgfmt binary.
MSGFMT ?= msgfmt

# PO is a list of all the po (gettext source) files.
PO = $(wildcard po/*.po)

# MO is a list of all the mo (gettext compiled) files to be built.
MO = $(patsubst po/%.po,po/build/%.mo,$(PO))

# XGOTEXT is the string extractor for gotext.
XGOTEXT ?= xgotext

# CODESIGN is the macOS signing tool.
CODESIGN ?= codesign

# SIGNTOOL is the Windows signing tool.
SIGNTOOL ?= signtool.exe

# FORCE_LOCALIZE forces localization to be run if set to non-empty.
FORCE_LOCALIZE ?=

# PKGS is a listing of packages that are considered to be a part of Git LFS, and
# are used in package-specific commands, such as the 'make test' targets. For
# example:
#
# 	make test                               # run 'go test' in all packages
# 	make PKGS='config git/githistory' test  # run 'go test' in config and
# 	                                        # git/githistory
#
# By default, it is a listing of all packages in Git LFS. When new packages (or
# sub-packages) are created, they should be added here.
ifndef PKGS
PKGS =
PKGS += commands
PKGS += config
PKGS += creds
PKGS += errors
PKGS += filepathfilter
PKGS += fs
PKGS += git
PKGS += git/gitattr
PKGS += git/githistory
PKGS += git
PKGS += lfs
PKGS += lfsapi
PKGS += lfshttp
PKGS += locking
PKGS += ssh
PKGS += subprocess
PKGS += tasklog
PKGS += tools
PKGS += tools/humanize
PKGS += tools/kv
PKGS += tr
PKGS += tq
endif

# X is the platform-specific extension for Git LFS binaries. It is automatically
# set to .exe on Windows, and the empty string on all other platforms. It may be
# overridden.
#
# BUILD_MAIN is the main ".go" file that contains func main() for Git LFS. On
# macOS and other non-Windows platforms, it is required that a specific
# entrypoint be given, hence the below conditional. On Windows, it is required
# that an entrypoint not be given so that goversioninfo can successfully embed
# the resource.syso file (for more, see below).
#
# BSDTAR is BSD (libarchive) tar.
ifeq ($(OS),Windows_NT)
X ?= .exe
BUILD_MAIN ?=
BSDTAR ?= C:/Windows/system32/tar.exe
else
X ?=
BUILD_MAIN ?= ./git-lfs.go
BSDTAR ?= $(shell $(TAR) --version | grep -q 'GNU tar' && echo bsdtar || echo $(TAR))
endif

# BUILD is a macro used to build a single binary of Git LFS using the above
# LD_FLAGS and GC_FLAGS.
#
# It takes three arguments:
#
# 	$(1) - a valid GOOS value, or empty-string
# 	$(2) - a valid GOARCH value, or empty-string
# 	$(3) - an optional program extension. If $(3) is given as '-foo', then the
# 	       program will be written to bin/git-lfs-foo.
#
# It uses BUILD_MAIN as defined above to specify the entrypoint for building Git
# LFS.
BUILD = GOOS=$(1) GOARCH=$(2) \
	$(GO) build \
	-ldflags="$(LD_FLAGS)" \
	-gcflags="$(GC_FLAGS)" \
	-trimpath \
	-o ./bin/git-lfs$(3) $(BUILD_MAIN)

# BUILD_TARGETS is the set of all platforms and architectures that Git LFS is
# built for.
BUILD_TARGETS = \
	bin/git-lfs-darwin-amd64 \
	bin/git-lfs-darwin-arm64 \
	bin/git-lfs-linux-arm \
	bin/git-lfs-linux-arm64 \
	bin/git-lfs-linux-amd64 \
	bin/git-lfs-linux-ppc64le \
	bin/git-lfs-linux-riscv64 \
	bin/git-lfs-linux-s390x \
	bin/git-lfs-linux-loong64 \
	bin/git-lfs-linux-386 \
	bin/git-lfs-freebsd-amd64 \
	bin/git-lfs-freebsd-386 \
	bin/git-lfs-windows-amd64.exe \
	bin/git-lfs-windows-386.exe \
	bin/git-lfs-windows-arm64.exe

# mangen is a shorthand for ensuring that commands/mancontent_gen.go is kept
# up-to-date with the contents of docs/man/*.ronn.
.PHONY : mangen
mangen : commands/mancontent_gen.go

# commands/mancontent_gen.go is generated by running 'go generate' on package
# 'commands' of Git LFS. It depends upon the contents of the 'docs' directory
# and converts those manpages into code.
commands/mancontent_gen.go : $(wildcard docs/man/*.adoc)
	GOOS= GOARCH= $(GO) generate github.com/git-lfs/git-lfs/v3/commands

# trgen is a shorthand for ensuring that tr/tr_gen.go is kept up-to-date with
# the contents of po/build/*.mo.
.PHONY : trgen
trgen : tr/tr_gen.go

# tr/tr_gen.go is generated by running 'go generate' on package
# 'tr' of Git LFS. It depends upon the contents of the 'po' directory
# and converts the .mo files.
tr/tr_gen.go : $(MO)
	GOOS= GOARCH= $(GO) generate github.com/git-lfs/git-lfs/v3/tr

po/build:
	mkdir -p po/build

# These targets build the MO files.
po/build/%.mo: po/%.po po/build
ifeq ($(FORCE_LOCALIZE),)
	if command -v $(MSGFMT) >/dev/null 2>&1; \
	then \
		$(MSGFMT) -o $@ $<; \
	fi
else
	$(MSGFMT) -o $@ $<
endif

po/i-reverse.po: po/default.pot
	script/gen-i-reverse $< $@

po/default.pot:
	if command -v $(XGOTEXT) >/dev/null 2>&1; \
	then \
		$(XGOTEXT) -in . -exclude .git,.github,vendor -out po -v; \
	fi

# Targets 'all' and 'build' build binaries of Git LFS for the above release
# matrix.
.PHONY : all build
all build : $(BUILD_TARGETS)

# The following bin/git-lfs-% targets make a single binary compilation of Git
# LFS for a specific operating system and architecture pair.
#
# They function by translating target names into arguments for the above BUILD
# builtin, and appending the appropriate suffix to the build target.
#
# On Windows, they also depend on the resource.syso target, which installs and
# embeds the versioninfo into the binary.
bin/git-lfs-darwin-amd64 : $(SOURCES) mangen trgen
	$(call BUILD,darwin,amd64,-darwin-amd64)
bin/git-lfs-darwin-arm64 : $(SOURCES) mangen trgen
	$(call BUILD,darwin,arm64,-darwin-arm64)
bin/git-lfs-linux-arm : $(SOURCES) mangen trgen
	GOARM=5 $(call BUILD,linux,arm,-linux-arm)
bin/git-lfs-linux-arm64 : $(SOURCES) mangen trgen
	$(call BUILD,linux,arm64,-linux-arm64)
bin/git-lfs-linux-amd64 : $(SOURCES) mangen trgen
	$(call BUILD,linux,amd64,-linux-amd64)
bin/git-lfs-linux-ppc64le : $(SOURCES) mangen trgen
	$(call BUILD,linux,ppc64le,-linux-ppc64le)
bin/git-lfs-linux-riscv64 : $(SOURCES) mangen trgen
	$(call BUILD,linux,riscv64,-linux-riscv64)
bin/git-lfs-linux-loong64 : $(SOURCES) mangen trgen
	$(call BUILD,linux,loong64,-linux-loong64)
bin/git-lfs-linux-s390x : $(SOURCES) mangen trgen
	$(call BUILD,linux,s390x,-linux-s390x)
bin/git-lfs-linux-386 : $(SOURCES) mangen trgen
	$(call BUILD,linux,386,-linux-386)
bin/git-lfs-freebsd-amd64 : $(SOURCES) mangen trgen
	$(call BUILD,freebsd,amd64,-freebsd-amd64)
bin/git-lfs-freebsd-386 : $(SOURCES) mangen trgen
	$(call BUILD,freebsd,386,-freebsd-386)
bin/git-lfs-windows-amd64.exe : resource.syso $(SOURCES) mangen trgen
	$(call BUILD,windows,amd64,-windows-amd64.exe)
bin/git-lfs-windows-386.exe : resource.syso $(SOURCES) mangen trgen
	$(call BUILD,windows,386,-windows-386.exe)
bin/git-lfs-windows-arm64.exe : resource.syso $(SOURCES) mangen trgen
	$(call BUILD,windows,arm64,-windows-arm64.exe)

# .DEFAULT_GOAL sets the operating system-appropriate Git LFS binary as the
# default output of 'make'.
.DEFAULT_GOAL := bin/git-lfs$(X)

# bin/git-lfs targets the default output of Git LFS on non-Windows operating
# systems, and respects the build knobs as above.
bin/git-lfs : $(SOURCES) fmt mangen trgen
	$(call BUILD,$(GOOS),$(GOARCH),)

# bin/git-lfs.exe targets the default output of Git LFS on Windows systems, and
# respects the build knobs as above.
bin/git-lfs.exe : $(SOURCES) resource.syso mangen trgen
	$(call BUILD,$(GOOS),$(GOARCH),.exe)

# resource.syso installs the 'goversioninfo' command and uses it in order to
# generate a binary that has information included necessary to create the
# Windows installer.
#
# Generating a new resource.syso is a pure function of the contents in the
# prerequisites listed below.
resource.syso : \
versioninfo.json script/windows-installer/git-lfs-logo.bmp \
script/windows-installer/git-lfs-logo.ico \
script/windows-installer/git-lfs-wizard-image.bmp
	$(GO) generate

# RELEASE_TARGETS is the set of all release artifacts that we generate over a
# particular release. They each have a corresponding entry in BUILD_TARGETS as
# above.
#
# Unlike BUILD_TARGETS above, each of the below create a compressed directory
# containing the matching binary, as well as the contents of RELEASE_INCLUDES
# below.
#
# To build a specific release, execute the following:
#
# 	make bin/releases/git-lfs-darwin-amd64-$(git describe HEAD).tar.gz
#
# To build a specific release with a custom VERSION suffix, run the following:
#
# 	make VERSION=my-version bin/releases/git-lfs-darwin-amd64-my-version.tar.gz
RELEASE_TARGETS = \
	bin/releases/git-lfs-darwin-amd64-$(VERSION).zip \
	bin/releases/git-lfs-darwin-arm64-$(VERSION).zip \
	bin/releases/git-lfs-linux-arm-$(VERSION).tar.gz \
	bin/releases/git-lfs-linux-arm64-$(VERSION).tar.gz \
	bin/releases/git-lfs-linux-amd64-$(VERSION).tar.gz \
	bin/releases/git-lfs-linux-ppc64le-$(VERSION).tar.gz \
	bin/releases/git-lfs-linux-riscv64-$(VERSION).tar.gz \
	bin/releases/git-lfs-linux-s390x-$(VERSION).tar.gz \
	bin/releases/git-lfs-linux-loong64-$(VERSION).tar.gz \
	bin/releases/git-lfs-linux-386-$(VERSION).tar.gz \
	bin/releases/git-lfs-freebsd-amd64-$(VERSION).tar.gz \
	bin/releases/git-lfs-freebsd-386-$(VERSION).tar.gz \
	bin/releases/git-lfs-windows-amd64-$(VERSION).zip \
	bin/releases/git-lfs-windows-386-$(VERSION).zip \
	bin/releases/git-lfs-windows-arm64-$(VERSION).zip \
	bin/releases/git-lfs-vendor-$(VERSION).tar.gz \
	bin/releases/git-lfs-$(VERSION).tar.gz

# RELEASE_INCLUDES are the names of additional files that are added to each
# release artifact.
RELEASE_INCLUDES = README.md CHANGELOG.md man

# release is a phony target that builds all of the release artifacts, and then
# shows the SHA 256 signature of each.
#
# To build all of the release binaries for a given Git LFS release:
#
# 	make release
.PHONY : release
release : $(RELEASE_TARGETS)
	shasum -a 256 $(RELEASE_TARGETS)

# bin/releases/git-lfs-%-$(VERSION).tar.gz generates a gzip-compressed TAR of
# the non-Windows and non-macOS release artifacts.
#
# It includes all of RELEASE_INCLUDES, as well as script/install.sh.
bin/releases/git-lfs-%-$(VERSION).tar.gz : \
$(RELEASE_INCLUDES) bin/git-lfs-% script/install.sh
	@mkdir -p bin/releases
	$(TAR) $(TAR_XFORM_ARG) '$(TAR_XFORM_CMD)!bin/git-lfs-.*!$(PREFIX)/git-lfs!' \
		$(TAR_XFORM_ARG) '$(TAR_XFORM_CMD)!script/!$(PREFIX)/!' \
		$(TAR_XFORM_ARG) '$(TAR_XFORM_CMD)!\(.*\)\.md!$(PREFIX)/\1.md!' \
		$(TAR_XFORM_ARG) '$(TAR_XFORM_CMD)!man!$(PREFIX)/man!' \
		--posix -czf $@ $^

# bin/releases/git-lfs-darwin-$(VERSION).zip generates a ZIP compression of all
# of the macOS release artifacts.
#
# It includes all of the RELEASE_INCLUDES, as well as script/install.sh.
bin/releases/git-lfs-darwin-%-$(VERSION).zip : \
$(RELEASE_INCLUDES) bin/git-lfs-darwin-% script/install.sh
	@mkdir -p bin/releases
	$(BSDTAR) --format zip \
		-s '!bin/git-lfs-.*!$(PREFIX)/git-lfs!' \
		-s '!script/!$(PREFIX)/!' \
		-s '!\(.*\)\.md!$(PREFIX)/\1.md!' \
		-s '!man!$(PREFIX)/man!' \
		-cf $@ $^

# bin/releases/git-lfs-windows-$(VERSION).zip generates a ZIP compression of all
# of the Windows release artifacts.
#
# It includes all of the RELEASE_INCLUDES, and converts LF-style line endings to
# CRLF in the non-binary components of the artifact.
bin/releases/git-lfs-windows-%-$(VERSION).zip : $(RELEASE_INCLUDES) bin/git-lfs-windows-%.exe
	@mkdir -p bin/releases
	# Windows's bsdtar doesn't support -s, so do the same thing as for Darwin, but
	# by hand.
	temp=$$(mktemp -d); \
	file="$$PWD/$@" && \
	mkdir -p "$$temp/$(PREFIX)/man" && \
	cp -r $^ "$$temp/$(PREFIX)" && \
	(cd "$$temp" && $(BSDTAR) --format zip -cf "$$file" $(PREFIX)) && \
	$(RM) -r "$$temp"

# bin/releases/git-lfs-vender-$(VERSION).tar.gz generates a tarball of the
# source code with an included "vendor" directory.
#
# This is useful for third parties who wish to have a source archive from
# which they can build directly without fetching any Go dependencies.
bin/releases/git-lfs-vendor-$(VERSION).tar.gz : vendor
	@mkdir -p bin/releases && \
	git archive -o tmp.tar --prefix=$(PREFIX)/ $(VERSION) && \
	chmod -R g+w vendor && \
	$(TAR) $(TAR_XFORM_ARG) '$(TAR_XFORM_CMD)!vendor!$(PREFIX)/vendor!' \
		-rf tmp.tar vendor && \
	$(GZIP) <tmp.tar >$@ && \
	$(RM) tmp.tar

# bin/releases/git-lfs-$(VERSION).tar.gz generates a tarball of the source code.
#
# This is useful for third parties who wish to have a bit-for-bit identical
# source archive to download and verify cryptographically.
bin/releases/git-lfs-$(VERSION).tar.gz :
	git archive -o $@ --prefix=$(PREFIX)/ --format tar.gz $(VERSION)

# release-linux is a target that builds Linux packages. It must be run on a
# system with Docker that can run Linux containers.
.PHONY : release-linux
release-linux:
	./docker/run_dockers.bsh

# release-windows-stage-1 is a target that builds the Windows Git LFS binaries
# and prepares them for signing.  It must be run on a Windows machine under Git
# Bash.
.PHONY : release-windows-stage-1
release-windows-stage-1: tmp/stage1

# After this stage completes, the binaries in this directory will be signed.
tmp/stage1:
	$(RM) -r tmp/stage1
	@mkdir -p tmp/stage1
	@# Using these particular filenames is required for the Inno Setup script to
	@# work properly.
	$(MAKE) -B GOOS=windows X=.exe GOARCH=amd64 && cp ./bin/git-lfs.exe ./git-lfs-x64.exe
	$(MAKE) -B GOOS=windows X=.exe GOARCH=386 && cp ./bin/git-lfs.exe ./git-lfs-x86.exe
	$(MAKE) -B GOOS=windows X=.exe GOARCH=arm64 && cp ./bin/git-lfs.exe ./git-lfs-arm64.exe
	mv git-lfs-x64.exe git-lfs-x86.exe git-lfs-arm64.exe tmp/stage1

# release-windows-stage-2 is a target that builds the InnoSetup installer and
# prepares it for signing.  It must be run on a Windows machine under Git Bash.
.PHONY : release-windows-stage-2
release-windows-stage-2: tmp/stage2

# After this stage completes, the binaries in tmp/stage2 will be signed.
tmp/stage2: tmp/stage1
	cp tmp/stage1/*.exe .
	@# The git-lfs-windows-*.exe file will be named according to the version
	@# number in the versioninfo.json, not according to $(VERSION).
	iscc.exe script/windows-installer/inno-setup-git-lfs-installer.iss
	mv git-lfs-windows-*.exe git-lfs-windows.exe
	$(RM) -r tmp/stage2
	@mkdir -p tmp/stage2
	cp git-lfs-windows.exe tmp/stage2

# release-windows-stage-3 is a target that produces an archive from signed
# Windows binaries from the previous stages.  It must be run on a Windows
# machine under Git Bash.
.PHONY : release-windows-stage-3
release-windows-stage-3: bin/releases/git-lfs-windows-assets-$(VERSION).tar.gz

bin/releases/git-lfs-windows-assets-$(VERSION).tar.gz : tmp/stage1 tmp/stage2
	mv tmp/stage1/git-lfs-x64.exe git-lfs-windows-amd64.exe
	mv tmp/stage1/git-lfs-x86.exe git-lfs-windows-386.exe
	mv tmp/stage1/git-lfs-arm64.exe git-lfs-windows-arm64.exe
	mv tmp/stage2/git-lfs-windows.exe git-lfs-windows.exe
	@# We use tar because Git Bash doesn't include zip.
	$(TAR) -czf $@ git-lfs-windows-amd64.exe git-lfs-windows-386.exe git-lfs-windows-arm64.exe git-lfs-windows.exe
	$(RM) git-lfs-windows-amd64.exe git-lfs-windows-386.exe git-lfs-windows-arm64.exe git-lfs-windows.exe

# release-windows-rebuild takes the archive produced by release-windows and
# incorporates the signed binaries into the existing zip archives.
.PHONY : release-windows-rebuild
release-windows-rebuild: bin/releases/git-lfs-windows-assets-$(VERSION).tar.gz
	temp=$$(mktemp -d); \
	file="$$PWD/$^"; \
	root="$$PWD" && \
		( \
			tar -C "$$temp" -xzf "$$file" && \
			for i in 386 amd64 arm64; do \
				temp2="$$(mktemp -d)" && \
				$(BSDTAR) -C "$$temp2" -xf "$$root/bin/releases/git-lfs-windows-$$i-$(VERSION).zip" && \
				rm -f "$$temp2/$(PREFIX)/"git-lfs*.exe && \
				cp "$$temp/git-lfs-windows-$$i.exe" "$$temp2/$(PREFIX)/git-lfs.exe" && \
				(cd "$$temp2" && $(BSDTAR) --format=zip -cf "$$root/bin/releases/git-lfs-windows-$$i-$(VERSION).zip" $(PREFIX)) && \
				rm -fr "$$temp2"; \
			done && \
			cp "$$temp/git-lfs-windows.exe" bin/releases/git-lfs-windows-$(VERSION).exe \
		); \
		status="$$?"; [ -n "$$temp" ] && $(RM) -r "$$temp"; exit "$$status"

# release-darwin is a target that builds and signs Darwin (macOS) binaries.  It must
# be run on a macOS machine with a suitable version of XCode.
.PHONY : release-darwin
release-darwin: bin/releases/git-lfs-darwin-amd64-$(VERSION).zip bin/releases/git-lfs-darwin-arm64-$(VERSION).zip
	@cert_id=$$(security find-identity -vp codesigning $(DARWIN_KEYCHAIN_ID) | grep '^ *1)' | awk '{print $$2}') && \
	for i in $^; do \
		temp=$$(mktemp -d) && \
		root=$$(pwd -P) && \
		( \
			$(BSDTAR) -C "$$temp" -xf "$$i" && \
			echo "Signing git-lfs binary for $$i ..." && \
			$(CODESIGN) --keychain $(DARWIN_KEYCHAIN_ID) -s "$$cert_id" --force --timestamp -v --options runtime "$$temp/$(PREFIX)/git-lfs" && \
			(cd "$$temp" && $(BSDTAR) --format zip -cf "$$root/$$i" "$(PREFIX)") && \
			echo "Signing $$i ..." && \
			$(CODESIGN) --keychain $(DARWIN_KEYCHAIN_ID) -s "$$cert_id" --force --timestamp -v --options runtime "$$i" && \
			echo "Notarizing $$i ..." && \
			jq -e ".notarize.path = \"$$i\" | .apple_id.username = \"$(DARWIN_DEV_USER)\"" script/macos/manifest.json > "$$temp/manifest.json"; \
			for j in 1 2 3; \
			do \
				script/notarize "$$i" && break; \
			done; \
		); \
		status="$$?"; [ -n "$$temp" ] && $(RM) -r "$$temp"; [ "$$status" -eq 0 ] || exit "$$status"; \
	done

.PHONY : release-write-certificate
release-write-certificate:
	@echo "Writing certificate to $(CERT_FILE)"
	@echo "$$CERT_CONTENTS" | base64 --decode >"$$CERT_FILE"
	@printf 'Wrote %d bytes (SHA256 %s) to certificate file\n' $$(wc -c <"$$CERT_FILE") $$(shasum -ba 256 "$$CERT_FILE" | cut -d' ' -f1)

# release-import-certificate imports the given certificate into the macOS
# keychain "lfs".  It is not generally recommended to run this on a user system,
# since it creates a new keychain and modifies the keychain search path.
.PHONY : release-import-certificate
release-import-certificate:
	@[ -n "$(CI)" ] || { echo "Don't run this target by hand." >&2; false; }
	@echo "Creating keychain"
	security create-keychain -p default $(DARWIN_KEYCHAIN_ID)
	security set-keychain-settings $(DARWIN_KEYCHAIN_ID)
	security unlock-keychain -p default $(DARWIN_KEYCHAIN_ID)
	@echo "Importing certificate from $(CERT_FILE)"
	@security import "$$CERT_FILE" -f pkcs12 -k $(DARWIN_KEYCHAIN_ID) -P "$$CERT_PASS" -A
	@echo "Verifying import and setting permissions"
	security default-keychain -s $(DARWIN_KEYCHAIN_ID)
	security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k default $(DARWIN_KEYCHAIN_ID) >/dev/null

# TEST_TARGETS is a list of all phony test targets. Each one of them corresponds
# to a specific kind or subset of tests to run.
TEST_TARGETS := test-bench test-verbose test-race
.PHONY : $(TEST_TARGETS) test
$(TEST_TARGETS) : test

# test-bench runs all Go benchmark tests, and nothing more.
test-bench : GO_TEST_EXTRA_ARGS=-run=__nothing__ -bench=.
# test-verbose runs all Go tests in verbose mode.
test-verbose : GO_TEST_EXTRA_ARGS=-v
# test-race runs all Go tests in race-detection mode.
test-race : GO_TEST_EXTRA_ARGS=-race

# test runs the Go tests with GO_TEST_EXTRA_ARGS in all specified packages,
# given by the PKGS variable.
#
# For example, a caller can invoke the race-detection tests in just the config
# package by running:
#
# 		make PKGS=config test-race
#
# Or in a series of packages, like:
#
# 		make PKGS="config lfsapi tools/kv" test-race
#
# And so on.
test : fmt $(.DEFAULT_GOAL)
	( \
		unset GIT_DIR; unset GIT_WORK_TREE; unset XDG_CONFIG_HOME; unset XDG_RUNTIME_DIR; \
		tempdir="$$(mktemp -d)"; \
		export HOME="$$tempdir"; \
		export GIT_CONFIG_NOSYSTEM=1; \
		$(GO) test -count=1 $(GO_TEST_EXTRA_ARGS) $(addprefix ./,$(PKGS)); \
		RET=$$?; \
		chmod -R u+w "$$tempdir"; \
		rm -fr "$$tempdir"; \
		exit $$RET; \
	)

# integration is a shorthand for running 'make' in the 't' directory.
.PHONY : integration
integration : bin/git-lfs$(X)
	make -C t test

# go.sum is a lockfile based on the contents of go.mod.
go.sum : go.mod
	$(GO) mod verify >/dev/null

# vendor updates the go.sum-file, and installs vendored dependencies into
# the vendor/ sub-tree, removing sub-packages (listed below) that are unused by
# Git LFS as well as test code.
.PHONY : vendor
vendor : go.mod
	$(GO) mod vendor -v

# fmt runs goimports over all files in Git LFS (as defined by $(SOURCES) above),
# and replaces their contents with a formatted one in-place.
#
# If $(GOIMPORTS) does not exist, or isn't otherwise executable, this recipe
# still performs the linting sequence, but gracefully skips over running a
# non-existent command.
.PHONY : fmt
ifeq ($(shell test -x "`command -v $(GOIMPORTS)`"; echo $$?),0)
fmt : $(SOURCES) | lint
	@$(GOIMPORTS) $(GOIMPORTS_EXTRA_OPTS) $?;
else
fmt : $(SOURCES) | lint
	@echo "git-lfs: skipping fmt, no goimports found at \`$(GOIMPORTS)\` ..."
endif

# lint ensures that there are all dependencies outside of the standard library
# are vendored in via vendor (see: above).
.PHONY : lint
lint : $(SOURCES)
	@! $(GO) list -f '{{ join .Deps "\n" }}' . \
	| $(XARGS) $(GO) list -f \
		'{{ if and (not .Standard) (not .Module) }} \
			{{ .ImportPath }} \
		{{ end }}' \
	| $(GREP) -v "github.com/git-lfs/git-lfs" \
	| $(GREP) "."

# MAN_ROFF_TARGETS is a list of all ROFF-style targets in the man pages.
MAN_ROFF_TARGETS = man/man1/git-lfs-checkout.1 \
  man/man1/git-lfs-clean.1 \
  man/man1/git-lfs-clone.1 \
  man/man1/git-lfs-completion.1 \
  man/man5/git-lfs-config.5 \
  man/man1/git-lfs-dedup.1 \
  man/man1/git-lfs-env.1 \
  man/man1/git-lfs-ext.1 \
  man/man7/git-lfs-faq.7 \
  man/man1/git-lfs-fetch.1 \
  man/man1/git-lfs-filter-process.1 \
  man/man1/git-lfs-fsck.1 \
  man/man1/git-lfs-install.1 \
  man/man1/git-lfs-lock.1 \
  man/man1/git-lfs-locks.1 \
  man/man1/git-lfs-logs.1 \
  man/man1/git-lfs-ls-files.1 \
  man/man1/git-lfs-merge-driver.1 \
  man/man1/git-lfs-migrate.1 \
  man/man1/git-lfs-pointer.1 \
  man/man1/git-lfs-post-checkout.1 \
  man/man1/git-lfs-post-commit.1 \
  man/man1/git-lfs-post-merge.1 \
  man/man1/git-lfs-pre-push.1 \
  man/man1/git-lfs-prune.1 \
  man/man1/git-lfs-pull.1 \
  man/man1/git-lfs-push.1 \
  man/man1/git-lfs-smudge.1 \
  man/man1/git-lfs-standalone-file.1 \
  man/man1/git-lfs-status.1 \
  man/man1/git-lfs-track.1 \
  man/man1/git-lfs-uninstall.1 \
  man/man1/git-lfs-unlock.1 \
  man/man1/git-lfs-untrack.1 \
  man/man1/git-lfs-update.1 \
  man/man1/git-lfs.1

# MAN_HTML_TARGETS is a list of all HTML-style targets in the man pages.
MAN_HTML_TARGETS = man/html/git-lfs-checkout.1.html \
  man/html/git-lfs-clean.1.html \
  man/html/git-lfs-clone.1.html \
  man/html/git-lfs-completion.1.html \
  man/html/git-lfs-config.5.html \
  man/html/git-lfs-dedup.1.html \
  man/html/git-lfs-env.1.html \
  man/html/git-lfs-ext.1.html \
  man/html/git-lfs-faq.7.html \
  man/html/git-lfs-fetch.1.html \
  man/html/git-lfs-filter-process.1.html \
  man/html/git-lfs-fsck.1.html \
  man/html/git-lfs-install.1.html \
  man/html/git-lfs-lock.1.html \
  man/html/git-lfs-locks.1.html \
  man/html/git-lfs-logs.1.html \
  man/html/git-lfs-ls-files.1.html \
  man/html/git-lfs-merge-driver.1.html \
  man/html/git-lfs-migrate.1.html \
  man/html/git-lfs-pointer.1.html \
  man/html/git-lfs-post-checkout.1.html \
  man/html/git-lfs-post-commit.1.html \
  man/html/git-lfs-post-merge.1.html \
  man/html/git-lfs-pre-push.1.html \
  man/html/git-lfs-prune.1.html \
  man/html/git-lfs-pull.1.html \
  man/html/git-lfs-push.1.html \
  man/html/git-lfs-smudge.1.html \
  man/html/git-lfs-standalone-file.1.html \
  man/html/git-lfs-status.1.html \
  man/html/git-lfs-track.1.html \
  man/html/git-lfs-uninstall.1.html \
  man/html/git-lfs-unlock.1.html \
  man/html/git-lfs-untrack.1.html \
  man/html/git-lfs-update.1.html \
  man/html/git-lfs.1.html

# man generates all ROFF- and HTML-style man page targets.
.PHONY : man
man : $(MAN_ROFF_TARGETS) $(MAN_HTML_TARGETS)

# Generate ROFF-style man pages from the corresponding .adoc files.
man/man1/%.1 : docs/man/%.adoc
	@mkdir -p man/man1
	$(ASCIIDOCTOR) $(ASCIIDOCTOR_EXTRA_ARGS) -b manpage -I docs/man/asciidoctor-extensions -r manpage-extension -o $@ $<
man/man5/%.5 : docs/man/%.adoc
	@mkdir -p man/man5
	$(ASCIIDOCTOR) $(ASCIIDOCTOR_EXTRA_ARGS) -b manpage -I docs/man/asciidoctor-extensions -r manpage-extension -o $@ $<
man/man7/%.7 : docs/man/%.adoc
	@mkdir -p man/man7
	$(ASCIIDOCTOR) $(ASCIIDOCTOR_EXTRA_ARGS) -b manpage -I docs/man/asciidoctor-extensions -r manpage-extension -o $@ $<

# Generate HTML-style man pages from the corresponding .adoc files.
man/html/%.1.html : docs/man/%.adoc
	@mkdir -p man/html
	$(ASCIIDOCTOR) $(ASCIIDOCTOR_EXTRA_ARGS) -b html5 -o $@ $<
man/html/%.5.html : docs/man/%.adoc
	@mkdir -p man/html
	$(ASCIIDOCTOR) $(ASCIIDOCTOR_EXTRA_ARGS) -b html5 -o $@ $<
man/html/%.7.html : docs/man/%.adoc
	@mkdir -p man/html
	$(ASCIIDOCTOR) $(ASCIIDOCTOR_EXTRA_ARGS) -b html5 -o $@ $<


================================================
FILE: README.md
================================================
# Git Large File Storage

[![CI status][ci_badge]][ci_url]

[ci_badge]: https://github.com/git-lfs/git-lfs/workflows/CI/badge.svg
[ci_url]: https://github.com/git-lfs/git-lfs/actions?query=workflow%3ACI

[Git LFS](https://git-lfs.github.com) is a command line extension and
[specification](docs/spec.md) for managing large files with Git.

The client is written in Go, with pre-compiled binaries available for Mac,
Windows, Linux, and FreeBSD. Check out the [website](http://git-lfs.github.com)
for an overview of features.

## Getting Started

### Installing

#### On Linux

Debian and RPM packages are available from packagecloud, see the [Linux installation instructions](INSTALLING.md).

#### On macOS

[Homebrew](https://brew.sh) bottles are distributed and can be installed via `brew install git-lfs`.

#### On Windows

Git LFS is included in the distribution of [Git for Windows](https://gitforwindows.org/).
Alternatively, you can install a recent version of Git LFS from the [Chocolatey](https://chocolatey.org/) package manager.

#### Using mise-en-place

If you are using the [mise-en-place](https://github.com/jdx/mise) tool manager, Git LFS can be installed and made available in all of your project directories by running:

```ShellSession
$ mise use --global git-lfs@latest
```

The `mise` utility supports Linux, macOS, and Windows, and provides various configuration options including system-wide settings for all users. See the project [documentation](https://mise.jdx.dev) for details on how to use this utility to manage your tools, environment variables, and also some tasks.

#### From binary

[Binary packages](https://github.com/git-lfs/git-lfs/releases) are
available for Linux, macOS, Windows, and FreeBSD.
The binary packages include a script which will:

- Install Git LFS binaries onto the system `$PATH`.  On Windows in particular, you may need to restart your command shell so any change to `$PATH` will take effect and Git can locate the Git LFS binary.
- Run `git lfs install` to perform required global configuration changes.

```ShellSession
$ ./install.sh
```

Note that Debian and RPM packages are built for multiple Linux distributions and versions for both amd64 and i386.
For arm64, only Debian packages are built and only for recent versions due to the cost of building in emulation.

#### From source

- Ensure you have the latest version of Go, GNU make, and a standard Unix-compatible build environment installed.
- On Windows, install `goversioninfo` with `go install github.com/josephspurrier/goversioninfo/cmd/goversioninfo@latest`.
- Run `make`.
- Place the `git-lfs` binary, which can be found in `bin`, on your system’s executable `$PATH` or equivalent.
- Git LFS requires global configuration changes once per-machine. This can be done by
running: `git lfs install`

#### Verifying releases

Releases are signed with the OpenPGP key of one of the core team members.  To
get these keys, you can run the following command, which will print them to
standard output:

```ShellSession
$ curl -L https://api.github.com/repos/git-lfs/git-lfs/tarball/core-gpg-keys | tar -Ozxf -
```

Once you have the keys, you can download the `sha256sums.asc` file and verify
the file you want like so:

```ShellSession
$ gpg -d sha256sums.asc | grep git-lfs-linux-amd64-v2.10.0.tar.gz | shasum -a 256 -c
```

For the convenience of distributors, we also provide a wider variety of signed
hashes in the `hashes.asc` file.  Those hashes are in the tagged BSD format, but
can be verified with Perl's `shasum` or the GNU hash utilities, just like the
ones in `sha256sums.asc`.

## Example Usage

To begin using Git LFS within a Git repository that is not already configured
for Git LFS, you can indicate which files you would like Git LFS to manage.
This can be done by running the following _from within a Git repository_:

```bash
$ git lfs track "*.psd"
```

(Where `*.psd` is the pattern of filenames that you wish to track. You can read
more about this pattern syntax
[here](https://
Download .txt
gitextract_xn00bgit/

├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── other-issue.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── ci.yml
│       └── release.yml
├── .gitignore
├── .mailmap
├── .ruby-version
├── CHANGELOG.md
├── CODE-OF-CONDUCT.md
├── CONTRIBUTING.md
├── INSTALLING.md
├── LICENSE.md
├── Makefile
├── README.md
├── SECURITY.md
├── commands/
│   ├── command_checkout.go
│   ├── command_clean.go
│   ├── command_clone.go
│   ├── command_dedup.go
│   ├── command_env.go
│   ├── command_ext.go
│   ├── command_fetch.go
│   ├── command_filter_process.go
│   ├── command_fsck.go
│   ├── command_install.go
│   ├── command_lock.go
│   ├── command_locks.go
│   ├── command_logs.go
│   ├── command_ls_files.go
│   ├── command_merge_driver.go
│   ├── command_migrate.go
│   ├── command_migrate_export.go
│   ├── command_migrate_import.go
│   ├── command_migrate_info.go
│   ├── command_pointer.go
│   ├── command_post_checkout.go
│   ├── command_post_commit.go
│   ├── command_post_merge.go
│   ├── command_pre_push.go
│   ├── command_prune.go
│   ├── command_pull.go
│   ├── command_push.go
│   ├── command_smudge.go
│   ├── command_standalone_file.go
│   ├── command_status.go
│   ├── command_track.go
│   ├── command_uninstall.go
│   ├── command_unlock.go
│   ├── command_untrack.go
│   ├── command_update.go
│   ├── command_version.go
│   ├── commands.go
│   ├── commands_test.go
│   ├── lockverifier.go
│   ├── multiwriter.go
│   ├── path.go
│   ├── path_nix.go
│   ├── path_windows.go
│   ├── pointers.go
│   ├── pull.go
│   ├── run.go
│   ├── uploader.go
│   └── uploader_test.go
├── config/
│   ├── config.go
│   ├── config_test.go
│   ├── delayed_environment.go
│   ├── environment.go
│   ├── environment_test.go
│   ├── extension.go
│   ├── extension_test.go
│   ├── fetcher.go
│   ├── git_fetcher.go
│   ├── git_fetcher_test.go
│   ├── map_fetcher.go
│   ├── os_fetcher.go
│   ├── url_config.go
│   ├── url_config_test.go
│   ├── util_nix.go
│   ├── util_windows.go
│   └── version.go
├── creds/
│   ├── access.go
│   ├── creds.go
│   ├── creds_test.go
│   ├── netrc.go
│   └── netrc_test.go
├── debian/
│   ├── changelog
│   ├── compat
│   ├── control
│   ├── copyright
│   ├── git-lfs.lintian-overrides
│   ├── git-lfs.manpages
│   ├── postinst
│   ├── prerm
│   ├── rules
│   └── source/
│       └── format
├── docker/
│   ├── README.md
│   └── run_dockers.bsh
├── docs/
│   ├── README.md
│   ├── api/
│   │   ├── README.md
│   │   ├── authentication.md
│   │   ├── basic-transfers.md
│   │   ├── batch.md
│   │   ├── locking.md
│   │   └── server-discovery.md
│   ├── custom-transfers.md
│   ├── extensions.md
│   ├── howto/
│   │   └── release-git-lfs.md
│   ├── l10n.md
│   ├── man/
│   │   ├── asciidoctor-extensions/
│   │   │   └── manpage-extension.rb
│   │   ├── git-lfs-checkout.adoc
│   │   ├── git-lfs-clean.adoc
│   │   ├── git-lfs-clone.adoc
│   │   ├── git-lfs-completion.adoc
│   │   ├── git-lfs-config.adoc
│   │   ├── git-lfs-dedup.adoc
│   │   ├── git-lfs-env.adoc
│   │   ├── git-lfs-ext.adoc
│   │   ├── git-lfs-faq.adoc
│   │   ├── git-lfs-fetch.adoc
│   │   ├── git-lfs-filter-process.adoc
│   │   ├── git-lfs-fsck.adoc
│   │   ├── git-lfs-install.adoc
│   │   ├── git-lfs-lock.adoc
│   │   ├── git-lfs-locks.adoc
│   │   ├── git-lfs-logs.adoc
│   │   ├── git-lfs-ls-files.adoc
│   │   ├── git-lfs-merge-driver.adoc
│   │   ├── git-lfs-migrate.adoc
│   │   ├── git-lfs-pointer.adoc
│   │   ├── git-lfs-post-checkout.adoc
│   │   ├── git-lfs-post-commit.adoc
│   │   ├── git-lfs-post-merge.adoc
│   │   ├── git-lfs-pre-push.adoc
│   │   ├── git-lfs-prune.adoc
│   │   ├── git-lfs-pull.adoc
│   │   ├── git-lfs-push.adoc
│   │   ├── git-lfs-smudge.adoc
│   │   ├── git-lfs-standalone-file.adoc
│   │   ├── git-lfs-status.adoc
│   │   ├── git-lfs-track.adoc
│   │   ├── git-lfs-uninstall.adoc
│   │   ├── git-lfs-unlock.adoc
│   │   ├── git-lfs-untrack.adoc
│   │   ├── git-lfs-update.adoc
│   │   ├── git-lfs.adoc
│   │   └── mangen.go
│   ├── proposals/
│   │   ├── README.md
│   │   ├── locking.md
│   │   ├── locking_api.md
│   │   ├── locking_notes.md
│   │   ├── multipart_transfer_mode.md
│   │   ├── ntlm.md
│   │   ├── ssh_adapter.md
│   │   └── transfer_adapters.md
│   └── spec.md
├── errors/
│   ├── context.go
│   ├── errors.go
│   ├── errors_test.go
│   ├── types.go
│   └── types_test.go
├── filepathfilter/
│   ├── filepathfilter.go
│   └── filepathfilter_test.go
├── fs/
│   ├── cleanup.go
│   ├── fs.go
│   └── fs_test.go
├── git/
│   ├── config.go
│   ├── config_test.go
│   ├── filter_process_scanner.go
│   ├── filter_process_scanner_test.go
│   ├── filter_process_status.go
│   ├── git.go
│   ├── git_test.go
│   ├── gitattr/
│   │   ├── attr.go
│   │   ├── attr_test.go
│   │   ├── files.go
│   │   ├── macro.go
│   │   ├── macro_test.go
│   │   ├── tree.go
│   │   └── tree_test.go
│   ├── githistory/
│   │   ├── fixtures/
│   │   │   ├── identical-blobs.git/
│   │   │   │   ├── HEAD
│   │   │   │   ├── config
│   │   │   │   ├── index
│   │   │   │   ├── logs/
│   │   │   │   │   ├── HEAD
│   │   │   │   │   └── refs/
│   │   │   │   │       └── heads/
│   │   │   │   │           └── master
│   │   │   │   ├── objects/
│   │   │   │   │   ├── 42/
│   │   │   │   │   │   └── 723ad796caa500ddf4e3f6ad37600ed5a65491
│   │   │   │   │   ├── 94/
│   │   │   │   │   │   └── f3610c08588440112ed977376f26a8fba169b0
│   │   │   │   │   └── b6/
│   │   │   │   │       └── 2b45ed2b59cf32dd676ca47497e76a1dab9c7e
│   │   │   │   └── refs/
│   │   │   │       └── heads/
│   │   │   │           └── master
│   │   │   ├── linear-history-with-annotated-tags.git/
│   │   │   │   ├── HEAD
│   │   │   │   ├── config
│   │   │   │   ├── index
│   │   │   │   ├── logs/
│   │   │   │   │   ├── HEAD
│   │   │   │   │   └── refs/
│   │   │   │   │       └── heads/
│   │   │   │   │           └── master
│   │   │   │   ├── objects/
│   │   │   │   │   ├── 05/
│   │   │   │   │   │   └── 797a38b05f910e6efe40dc1a5c0a046a9403e8
│   │   │   │   │   ├── 20/
│   │   │   │   │   │   └── ecedad3e74a113695fe5f00ab003694e2e1e9c
│   │   │   │   │   ├── 22/
│   │   │   │   │   │   └── 8afe30855933151f7a88e70d9d88314fd2f191
│   │   │   │   │   ├── 2e/
│   │   │   │   │   │   └── 65efe2a145dda7ee51d1741299f848e5bf752e
│   │   │   │   │   ├── 34/
│   │   │   │   │   │   └── 10062ba67c5ed59b854387a8bc0ec012479368
│   │   │   │   │   ├── 3c/
│   │   │   │   │   │   └── b3201d7942353fff5f45e03d114e8e7a061f87
│   │   │   │   │   ├── 4a/
│   │   │   │   │   │   └── 78e180c45f18489941174df19d538c26d5318b
│   │   │   │   │   ├── 52/
│   │   │   │   │   │   └── a8963f48d54c7d352695a278ca4b025e130cb4
│   │   │   │   │   ├── 63/
│   │   │   │   │   │   └── d8dbd40c23542e740659a7168a0ce3138ea748
│   │   │   │   │   ├── 6b/
│   │   │   │   │   │   └── de0b381fa1a039396445e2ce5a28c0451fde15
│   │   │   │   │   ├── 91/
│   │   │   │   │   │   └── b85be6928569390e937479509b80a1d0dccb0c
│   │   │   │   │   └── d9/
│   │   │   │   │       └── 41e4756add6b06f5bee766fcf669f55419f13f
│   │   │   │   └── refs/
│   │   │   │       ├── heads/
│   │   │   │       │   └── master
│   │   │   │       └── tags/
│   │   │   │           └── middle
│   │   │   ├── linear-history-with-tags.git/
│   │   │   │   ├── HEAD
│   │   │   │   ├── config
│   │   │   │   ├── index
│   │   │   │   ├── logs/
│   │   │   │   │   ├── HEAD
│   │   │   │   │   └── refs/
│   │   │   │   │       └── heads/
│   │   │   │   │           └── master
│   │   │   │   ├── objects/
│   │   │   │   │   ├── 20/
│   │   │   │   │   │   └── ecedad3e74a113695fe5f00ab003694e2e1e9c
│   │   │   │   │   ├── 22/
│   │   │   │   │   │   └── 8afe30855933151f7a88e70d9d88314fd2f191
│   │   │   │   │   ├── 2e/
│   │   │   │   │   │   └── 65efe2a145dda7ee51d1741299f848e5bf752e
│   │   │   │   │   ├── 34/
│   │   │   │   │   │   └── 10062ba67c5ed59b854387a8bc0ec012479368
│   │   │   │   │   ├── 3c/
│   │   │   │   │   │   └── b3201d7942353fff5f45e03d114e8e7a061f87
│   │   │   │   │   ├── 52/
│   │   │   │   │   │   └── a8963f48d54c7d352695a278ca4b025e130cb4
│   │   │   │   │   ├── 63/
│   │   │   │   │   │   └── d8dbd40c23542e740659a7168a0ce3138ea748
│   │   │   │   │   ├── 91/
│   │   │   │   │   │   └── b85be6928569390e937479509b80a1d0dccb0c
│   │   │   │   │   └── d9/
│   │   │   │   │       └── 41e4756add6b06f5bee766fcf669f55419f13f
│   │   │   │   └── refs/
│   │   │   │       ├── heads/
│   │   │   │       │   └── master
│   │   │   │       └── tags/
│   │   │   │           └── middle
│   │   │   ├── linear-history.git/
│   │   │   │   ├── HEAD
│   │   │   │   ├── config
│   │   │   │   ├── index
│   │   │   │   ├── logs/
│   │   │   │   │   ├── HEAD
│   │   │   │   │   └── refs/
│   │   │   │   │       └── heads/
│   │   │   │   │           └── master
│   │   │   │   ├── objects/
│   │   │   │   │   ├── 56/
│   │   │   │   │   │   └── a6051ca2b02b04ef92d5150c9ef600403cb1de
│   │   │   │   │   ├── 62/
│   │   │   │   │   │   └── 811b8f930323895033b3b338c35f51c0b7268b
│   │   │   │   │   ├── 6e/
│   │   │   │   │   │   └── 07bd31cb70c4add2c973481ad4fa38b235ca69
│   │   │   │   │   ├── 71/
│   │   │   │   │   │   └── a488ec1804ee97ea651b094aa9181ca85aab0a
│   │   │   │   │   ├── c5/
│   │   │   │   │   │   └── decfe1fcf39b8c489f4a0bf3b3823676339f80
│   │   │   │   │   ├── d8/
│   │   │   │   │   │   └── 263ee9860594d2806b0dfd1bfd17528b0ba2a4
│   │   │   │   │   ├── e4/
│   │   │   │   │   │   └── 40e5c842586965a7fb77deda2eca68612b1f53
│   │   │   │   │   ├── e6/
│   │   │   │   │   │   └── 69b63f829bfb0b91fc52a5bcea53dd7977a0ee
│   │   │   │   │   └── ef/
│   │   │   │   │       └── eab7a9b61312fa56fc74eee1e0f5a714abfb70
│   │   │   │   └── refs/
│   │   │   │       └── heads/
│   │   │   │           └── master
│   │   │   ├── non-repeated-subtrees.git/
│   │   │   │   ├── HEAD
│   │   │   │   ├── config
│   │   │   │   ├── index
│   │   │   │   ├── logs/
│   │   │   │   │   ├── HEAD
│   │   │   │   │   └── refs/
│   │   │   │   │       └── heads/
│   │   │   │   │           └── master
│   │   │   │   ├── objects/
│   │   │   │   │   ├── 07/
│   │   │   │   │   │   └── bd7fbfc41b7d36135bcffe7c465490f4aca32d
│   │   │   │   │   ├── 12/
│   │   │   │   │   │   └── 7ececad475cde6da0048051d62121cabd23194
│   │   │   │   │   ├── 19/
│   │   │   │   │   │   └── acdd81ab0abc15c771fe005bf1c2825e4e6080
│   │   │   │   │   ├── 37/
│   │   │   │   │   │   └── f99c7f2706d317b3bf7ff13d574eef33d8788a
│   │   │   │   │   ├── 3d/
│   │   │   │   │   │   └── 1baaaceec085c52e3e57a47a75b87b7615d0ef
│   │   │   │   │   ├── 8d/
│   │   │   │   │   │   └── 14cbf983b3fad683171c9418998d9f68340823
│   │   │   │   │   └── bc/
│   │   │   │   │       └── 63077ac5e575ccc9dbbd93dc882f1e10600ea7
│   │   │   │   └── refs/
│   │   │   │       └── heads/
│   │   │   │           └── master
│   │   │   ├── octopus-merge.git/
│   │   │   │   ├── HEAD
│   │   │   │   ├── ORIG_HEAD
│   │   │   │   ├── config
│   │   │   │   ├── index
│   │   │   │   ├── logs/
│   │   │   │   │   ├── HEAD
│   │   │   │   │   └── refs/
│   │   │   │   │       └── heads/
│   │   │   │   │           ├── branch-a
│   │   │   │   │           ├── branch-b
│   │   │   │   │           └── master
│   │   │   │   ├── objects/
│   │   │   │   │   ├── 04/
│   │   │   │   │   │   └── df07b08ca746b3167d0f1d1514e2f39a52c16c
│   │   │   │   │   ├── 15/
│   │   │   │   │   │   └── 805fe2044dc1a0508853e93d1a230bd94636be
│   │   │   │   │   ├── 25/
│   │   │   │   │   │   └── 1e6b3461a3b5adc6bab694d5ae1abc878edf85
│   │   │   │   │   ├── 2e/
│   │   │   │   │   │   └── 65efe2a145dda7ee51d1741299f848e5bf752e
│   │   │   │   │   ├── 2f/
│   │   │   │   │   │   └── 3a8ec99d5b459b41b6675e52758e397c5e3103
│   │   │   │   │   ├── 5a/
│   │   │   │   │   │   └── 0581b158a81b8fc5d2169c2ac2ca7772ff13fd
│   │   │   │   │   ├── 63/
│   │   │   │   │   │   └── d8dbd40c23542e740659a7168a0ce3138ea748
│   │   │   │   │   ├── 6c/
│   │   │   │   │   │   └── 9ccaeb45446e3fa88cd5848a940fd34c18192b
│   │   │   │   │   ├── 8b/
│   │   │   │   │   │   └── e6d64cddab01f53381e9feafe50d95ca5e6629
│   │   │   │   │   ├── b6/
│   │   │   │   │   │   └── fc4c620b67d95f953a5c1c1230aaab5db5a1b0
│   │   │   │   │   └── e9/
│   │   │   │   │       └── 4edfabfb7605f7cb959b4ce8fb6652b509fe03
│   │   │   │   └── refs/
│   │   │   │       └── heads/
│   │   │   │           ├── branch-a
│   │   │   │           ├── branch-b
│   │   │   │           └── master
│   │   │   ├── packed-objects.git/
│   │   │   │   ├── HEAD
│   │   │   │   ├── config
│   │   │   │   ├── index
│   │   │   │   ├── info/
│   │   │   │   │   └── refs
│   │   │   │   ├── logs/
│   │   │   │   │   ├── HEAD
│   │   │   │   │   └── refs/
│   │   │   │   │       └── heads/
│   │   │   │   │           └── master
│   │   │   │   ├── objects/
│   │   │   │   │   ├── info/
│   │   │   │   │   │   └── packs
│   │   │   │   │   └── pack/
│   │   │   │   │       ├── pack-ac516ce2d006668dc5e001e8dda0aa1c7198500f.idx
│   │   │   │   │       └── pack-ac516ce2d006668dc5e001e8dda0aa1c7198500f.pack
│   │   │   │   └── refs/
│   │   │   │       └── heads/
│   │   │   │           └── master
│   │   │   └── repeated-subtrees.git/
│   │   │       ├── HEAD
│   │   │       ├── config
│   │   │       ├── index
│   │   │       ├── logs/
│   │   │       │   ├── HEAD
│   │   │       │   └── refs/
│   │   │       │       └── heads/
│   │   │       │           └── master
│   │   │       ├── objects/
│   │   │       │   ├── 0b/
│   │   │       │   │   └── 4747509ab885114690ff291f8f108045b1d749
│   │   │       │   ├── 12/
│   │   │       │   │   └── b98c239e8f933d213617a1b965333d478b2743
│   │   │       │   ├── 2e/
│   │   │       │   │   └── 65efe2a145dda7ee51d1741299f848e5bf752e
│   │   │       │   ├── 47/
│   │   │       │   │   └── d4d71022adc7ec6a14250d23491e535ec228f4
│   │   │       │   ├── 5e/
│   │   │       │   │   └── 497ceceb14ad3c43bac781ed5c804bc67e8f3b
│   │   │       │   ├── 63/
│   │   │       │   │   └── d8dbd40c23542e740659a7168a0ce3138ea748
│   │   │       │   ├── b9/
│   │   │       │   │   └── 621d5d84b3174de020ad2c869f43b2f61f337f
│   │   │       │   └── bc/
│   │   │       │       └── 4d1181aca5a33673d7c5d4c209d09ce1cfabd7
│   │   │       └── refs/
│   │   │           └── heads/
│   │   │               └── master
│   │   ├── fixtures_test.go
│   │   ├── ref_updater.go
│   │   ├── ref_updater_test.go
│   │   ├── rewriter.go
│   │   └── rewriter_test.go
│   ├── ls_files.go
│   ├── ls_tree_scanner.go
│   ├── ls_tree_scanner_test.go
│   ├── object_scanner.go
│   ├── refs.go
│   ├── refs_test.go
│   ├── rev_list_scanner.go
│   ├── rev_list_scanner_test.go
│   └── version.go
├── git-lfs.go
├── git-lfs_windows_386.go
├── git-lfs_windows_amd64.go
├── git-lfs_windows_arm64.go
├── go.mod
├── go.sum
├── lfs/
│   ├── attribute.go
│   ├── config.go
│   ├── config_test.go
│   ├── diff_index_scanner.go
│   ├── extension.go
│   ├── gitfilter.go
│   ├── gitfilter_clean.go
│   ├── gitfilter_smudge.go
│   ├── gitscanner.go
│   ├── gitscanner_catfilebatch.go
│   ├── gitscanner_catfilebatchcheck.go
│   ├── gitscanner_catfilebatchcheckscanner_test.go
│   ├── gitscanner_index.go
│   ├── gitscanner_log.go
│   ├── gitscanner_pointerscanner_test.go
│   ├── gitscanner_refs.go
│   ├── gitscanner_remotes.go
│   ├── gitscanner_tree.go
│   ├── hook.go
│   ├── lfs.go
│   ├── lfs_test.go
│   ├── pointer.go
│   ├── pointer_test.go
│   ├── scanner.go
│   ├── scanner_git_test.go
│   ├── scanner_test.go
│   ├── util.go
│   └── util_test.go
├── lfsapi/
│   ├── auth.go
│   ├── auth_test.go
│   ├── body.go
│   ├── client.go
│   ├── endpoint_finder.go
│   ├── endpoint_finder_test.go
│   ├── kerberos.go
│   ├── lfsapi.go
│   └── response_test.go
├── lfshttp/
│   ├── body.go
│   ├── certs.go
│   ├── certs_test.go
│   ├── client.go
│   ├── client_test.go
│   ├── cookies.go
│   ├── endpoint.go
│   ├── errors.go
│   ├── lfshttp.go
│   ├── proxy.go
│   ├── proxy_test.go
│   ├── retries.go
│   ├── retries_test.go
│   ├── ssh.go
│   ├── ssh_test.go
│   ├── standalone/
│   │   └── standalone.go
│   ├── stats.go
│   ├── stats_test.go
│   ├── verbose.go
│   └── verbose_test.go
├── locking/
│   ├── api.go
│   ├── api_test.go
│   ├── cache.go
│   ├── cache_test.go
│   ├── lockable.go
│   ├── locks.go
│   ├── locks_test.go
│   ├── schemas/
│   │   ├── http-lock-create-request-schema.json
│   │   ├── http-lock-create-response-schema.json
│   │   ├── http-lock-delete-request-schema.json
│   │   ├── http-lock-list-response-schema.json
│   │   └── http-lock-verify-response-schema.json
│   └── ssh.go
├── po/
│   └── es.po
├── rpm/
│   ├── INSTALL.md
│   ├── SPECS/
│   │   └── git-lfs.spec
│   └── build_rpms.bsh
├── script/
│   ├── build-git
│   ├── changelog
│   ├── cibuild
│   ├── compile-win-installer-unsigned.bat
│   ├── gen-i-reverse
│   ├── hash-files
│   ├── install-git-source
│   ├── install.sh
│   ├── lib/
│   │   └── distro.rb
│   ├── macos/
│   │   └── manifest.json
│   ├── notarize
│   ├── packagecloud.rb
│   ├── spec/
│   │   └── distro_spec.rb
│   ├── update-version
│   ├── upload
│   └── windows-installer/
│       └── inno-setup-git-lfs-installer.iss
├── ssh/
│   ├── connection.go
│   ├── pktline.go
│   ├── protocol.go
│   ├── ssh.go
│   └── ssh_test.go
├── subprocess/
│   ├── buffered_cmd.go
│   ├── cmd.go
│   ├── path.go
│   ├── path_nix.go
│   ├── path_windows.go
│   ├── subprocess.go
│   ├── subprocess_nix.go
│   ├── subprocess_test.go
│   └── subprocess_windows.go
├── t/
│   ├── Makefile
│   ├── README.md
│   ├── cmd/
│   │   ├── git-credential-lfsnoop.go
│   │   ├── git-credential-lfstest.go
│   │   ├── lfs-askpass.go
│   │   ├── lfs-ssh-echo.go
│   │   ├── lfs-ssh-proxy-test.go
│   │   ├── lfstest-badpathcheck.go
│   │   ├── lfstest-caseinverterextension.go
│   │   ├── lfstest-count-tests.go
│   │   ├── lfstest-customadapter.go
│   │   ├── lfstest-genrandom.go
│   │   ├── lfstest-gitserver.go
│   │   ├── lfstest-nanomtime.go
│   │   ├── lfstest-realpath.go
│   │   ├── lfstest-standalonecustomadapter.go
│   │   ├── lfstest-testutils.go
│   │   └── util/
│   │       └── testutils.go
│   ├── fixtures/
│   │   ├── completions/
│   │   │   ├── git-lfs-completion.bash
│   │   │   ├── git-lfs-completion.fish
│   │   │   └── git-lfs-completion.zsh
│   │   ├── migrate.sh
│   │   └── templates/
│   │       ├── HEAD
│   │       └── info/
│   │           └── exclude
│   ├── t-alternates.sh
│   ├── t-askpass.sh
│   ├── t-attributes.sh
│   ├── t-batch-error-handling.sh
│   ├── t-batch-retries-ratelimit.sh
│   ├── t-batch-retries.sh
│   ├── t-batch-storage-retries-ratelimit.sh
│   ├── t-batch-transfer-size.sh
│   ├── t-batch-transfer.sh
│   ├── t-batch-unknown-oids.sh
│   ├── t-checkout.sh
│   ├── t-cherry-pick-commits.sh
│   ├── t-chunked-transfer-encoding.sh
│   ├── t-clean.sh
│   ├── t-clone-deprecated.sh
│   ├── t-clone.sh
│   ├── t-commit-delete-push.sh
│   ├── t-completion.sh
│   ├── t-config.sh
│   ├── t-content-type.sh
│   ├── t-credentials-no-prompt.sh
│   ├── t-credentials-protect.sh
│   ├── t-credentials.sh
│   ├── t-custom-transfers.sh
│   ├── t-dedup.sh
│   ├── t-duplicate-oids.sh
│   ├── t-env.sh
│   ├── t-expired.sh
│   ├── t-ext.sh
│   ├── t-extra-header.sh
│   ├── t-fetch-include.sh
│   ├── t-fetch-paths.sh
│   ├── t-fetch-recent.sh
│   ├── t-fetch-refspec.sh
│   ├── t-fetch.sh
│   ├── t-filter-branch.sh
│   ├── t-filter-process.sh
│   ├── t-fsck.sh
│   ├── t-happy-path.sh
│   ├── t-install-custom-hooks-path-unsupported.sh
│   ├── t-install-custom-hooks-path.sh
│   ├── t-install-worktree-unsupported.sh
│   ├── t-install-worktree.sh
│   ├── t-install.sh
│   ├── t-lock.sh
│   ├── t-locks.sh
│   ├── t-logs.sh
│   ├── t-ls-files.sh
│   ├── t-malformed-pointers.sh
│   ├── t-merge-driver.sh
│   ├── t-mergetool.sh
│   ├── t-migrate-export.sh
│   ├── t-migrate-fixup.sh
│   ├── t-migrate-import-no-rewrite.sh
│   ├── t-migrate-import.sh
│   ├── t-migrate-info.sh
│   ├── t-multiple-remotes.sh
│   ├── t-no-remote.sh
│   ├── t-object-authenticated.sh
│   ├── t-path.sh
│   ├── t-pointer.sh
│   ├── t-post-checkout.sh
│   ├── t-post-commit.sh
│   ├── t-post-merge.sh
│   ├── t-pre-push.sh
│   ├── t-progress-meter.sh
│   ├── t-progress.sh
│   ├── t-prune-worktree.sh
│   ├── t-prune.sh
│   ├── t-pull.sh
│   ├── t-push-bad-dns.sh
│   ├── t-push-failures-local.sh
│   ├── t-push-failures-remote.sh
│   ├── t-push-file-with-branch-name.sh
│   ├── t-push.sh
│   ├── t-reference-clone.sh
│   ├── t-repo-format.sh
│   ├── t-resume-http-range.sh
│   ├── t-resume-tus.sh
│   ├── t-smudge.sh
│   ├── t-ssh.sh
│   ├── t-standalone-file.sh
│   ├── t-status.sh
│   ├── t-submodule-lfsconfig.sh
│   ├── t-submodule-recurse.sh
│   ├── t-submodule.sh
│   ├── t-tempfile.sh
│   ├── t-track-attrs.sh
│   ├── t-track-wildcards.sh
│   ├── t-track.sh
│   ├── t-umask.sh
│   ├── t-uninstall-worktree-unsupported.sh
│   ├── t-uninstall-worktree.sh
│   ├── t-uninstall.sh
│   ├── t-unlock.sh
│   ├── t-untrack.sh
│   ├── t-unusual-filenames.sh
│   ├── t-update.sh
│   ├── t-upload-redirect.sh
│   ├── t-usage.sh
│   ├── t-verify.sh
│   ├── t-version.sh
│   ├── t-worktree.sh
│   ├── t-zero-len-file.sh
│   ├── testenv.sh
│   ├── testhelpers.sh
│   └── testlib.sh
├── tasklog/
│   ├── list_task.go
│   ├── list_task_test.go
│   ├── log.go
│   ├── log_test.go
│   ├── percentage_task.go
│   ├── percentage_task_test.go
│   ├── simple_task.go
│   ├── simple_task_test.go
│   ├── task.go
│   ├── waiting_task.go
│   └── waiting_task_test.go
├── tools/
│   ├── channels.go
│   ├── copycallback.go
│   ├── copycallback_test.go
│   ├── cygwin.go
│   ├── cygwin_windows.go
│   ├── dir_walker.go
│   ├── dir_walker_test.go
│   ├── filetools.go
│   ├── filetools_nix.go
│   ├── filetools_test.go
│   ├── filetools_windows.go
│   ├── humanize/
│   │   ├── humanize.go
│   │   ├── humanize_test.go
│   │   └── package.go
│   ├── iotools.go
│   ├── iotools_test.go
│   ├── kv/
│   │   ├── keyvaluestore.go
│   │   └── keyvaluestore_test.go
│   ├── math.go
│   ├── math_test.go
│   ├── ordered_set.go
│   ├── ordered_set_test.go
│   ├── os_tools.go
│   ├── robustio.go
│   ├── robustio_windows.go
│   ├── str_tools.go
│   ├── str_tools_test.go
│   ├── stringset.go
│   ├── sync_writer.go
│   ├── time_tools.go
│   ├── time_tools_test.go
│   ├── umask_nix.go
│   ├── umask_windows.go
│   ├── util_darwin.go
│   ├── util_darwin_test.go
│   ├── util_generic.go
│   ├── util_linux.go
│   ├── util_test.go
│   ├── util_windows.go
│   └── util_windows_test.go
├── tq/
│   ├── adapterbase.go
│   ├── api.go
│   ├── api_test.go
│   ├── basic_download.go
│   ├── basic_upload.go
│   ├── custom.go
│   ├── custom_test.go
│   ├── errors.go
│   ├── errors_test.go
│   ├── manifest.go
│   ├── manifest_test.go
│   ├── meter.go
│   ├── schemas/
│   │   ├── http-batch-request-schema.json
│   │   └── http-batch-response-schema.json
│   ├── ssh.go
│   ├── transfer.go
│   ├── transfer_queue.go
│   ├── transfer_queue_test.go
│   ├── transfer_test.go
│   ├── tus_upload.go
│   ├── verify.go
│   └── verify_test.go
├── tr/
│   ├── tr.go
│   └── trgen/
│       └── trgen.go
└── versioninfo.json
Download .txt
Showing preview only (261K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2860 symbols across 281 files)

FILE: commands/command_checkout.go
  function checkoutCommand (line 26) | func checkoutCommand(cmd *cobra.Command, args []string) {
  function checkoutConflict (line 108) | func checkoutConflict(file string, stage git.IndexStage) {
  function whichCheckout (line 160) | func whichCheckout() (stage git.IndexStage, err error) {
  function rootedPathPatterns (line 186) | func rootedPathPatterns(args []string) []string {
  function init (line 199) | func init() {

FILE: commands/command_clean.go
  function clean (line 27) | func clean(gf *lfs.GitFilter, to io.Writer, from io.Reader, fileName str...
  function cleanCommand (line 93) | func cleanCommand(cmd *cobra.Command, args []string) {
  function init (line 114) | func init() {

FILE: commands/command_clone.go
  function cloneCommand (line 24) | func cloneCommand(cmd *cobra.Command, args []string) {
  function postCloneSubmodules (line 106) | func postCloneSubmodules(args []string) error {
  function init (line 132) | func init() {

FILE: commands/command_dedup.go
  function dedupTestCommand (line 27) | func dedupTestCommand(*cobra.Command, []string) {
  function dedupCommand (line 44) | func dedupCommand(cmd *cobra.Command, args []string) {
  function dedup (line 106) | func dedup(p *lfs.WrappedPointer) (success bool, err error) {
  function init (line 143) | func init() {

FILE: commands/command_env.go
  function envCommand (line 11) | func envCommand(cmd *cobra.Command, args []string) {
  function init (line 58) | func init() {

FILE: commands/command_ext.go
  function extCommand (line 11) | func extCommand(cmd *cobra.Command, args []string) {
  function extListCommand (line 15) | func extListCommand(cmd *cobra.Command, args []string) {
  function printAllExts (line 28) | func printAllExts() {
  function printExt (line 39) | func printExt(ext config.Extension) {
  function init (line 46) | func init() {

FILE: commands/command_fetch.go
  type fetchWatcher (line 31) | type fetchWatcher struct
    method registerTransfer (line 36) | func (d *fetchWatcher) registerTransfer(t *tq.Transfer) {
    method dumpJson (line 51) | func (d *fetchWatcher) dumpJson() {
    method hasObserved (line 65) | func (d *fetchWatcher) hasObserved(oid string) bool {
  function hasToPrintTransfers (line 69) | func hasToPrintTransfers() bool {
  function printProgress (line 73) | func printProgress(format string, args ...interface{}) {
  function getIncludeExcludeArgs (line 79) | func getIncludeExcludeArgs(cmd *cobra.Command) (include, exclude *string) {
  function fetchCommand (line 92) | func fetchCommand(cmd *cobra.Command, args []string) {
  function pointersToFetchForRef (line 203) | func pointersToFetchForRef(ref string, filter *filepathfilter.Filter) ([...
  function fetchRef (line 225) | func fetchRef(ref string, filter *filepathfilter.Filter, watcher *fetchW...
  function pointersToFetchForRefs (line 233) | func pointersToFetchForRefs(refs []string) ([]*lfs.WrappedPointer, error) {
  function fetchRefs (line 263) | func fetchRefs(refs []string, watcher *fetchWatcher) bool {
  function fetchPreviousVersions (line 273) | func fetchPreviousVersions(ref string, since time.Time, filter *filepath...
  function fetchRecent (line 295) | func fetchRecent(fetchconf lfs.FetchPruneConfig, alreadyFetchedRefs []*g...
  function fetchAll (line 358) | func fetchAll(watcher *fetchWatcher) bool {
  function scanAll (line 364) | func scanAll() []*lfs.WrappedPointer {
  function fetch (line 400) | func fetch(allPointers []*lfs.WrappedPointer, watcher *fetchWatcher) bool {
  function pointersToFetch (line 440) | func pointersToFetch(allPointers []*lfs.WrappedPointer, watcher *fetchWa...
  function init (line 474) | func init() {

FILE: commands/command_filter_process.go
  constant cleanFilterBufferCapacity (line 26) | cleanFilterBufferCapacity = 512
  constant smudgeFilterBufferCapacity (line 31) | smudgeFilterBufferCapacity = pktline.MaxPacketLength
  function filterCommand (line 39) | func filterCommand(cmd *cobra.Command, args []string) {
  function infiniteTransferBuffer (line 251) | func infiniteTransferBuffer(q *tq.TransferQueue, available chan<- *tq.Tr...
  function incomingOrCached (line 311) | func incomingOrCached(r io.Reader, ptr *lfs.Pointer) (io.Reader, error) {
  function readAvailable (line 341) | func readAvailable(ch <-chan *tq.Transfer, cap int) []*tq.Transfer {
  function pathnames (line 367) | func pathnames(ts []*tq.Transfer) []string {
  function statusFromErr (line 378) | func statusFromErr(err error) git.FilterProcessStatus {
  function delayedStatusFromErr (line 388) | func delayedStatusFromErr(err error) git.FilterProcessStatus {
  function init (line 399) | func init() {

FILE: commands/command_fsck.go
  type corruptPointer (line 28) | type corruptPointer struct
    method String (line 37) | func (p corruptPointer) String() string {
  function fsckCommand (line 47) | func fsckCommand(cmd *cobra.Command, args []string) {
  function doFsckObjects (line 127) | func doFsckObjects(include, exclude string, useIndex bool) []string {
  function doFsckPointers (line 170) | func doFsckPointers(include, exclude string) []corruptPointer {
  function fsckPointer (line 215) | func fsckPointer(name, oid string, size int64) (bool, error) {
  function init (line 250) | func init() {

FILE: commands/command_install.go
  function installCommand (line 23) | func installCommand(cmd *cobra.Command, args []string) {
  function cmdInstallOptions (line 37) | func cmdInstallOptions() *lfs.FilterOptions {
  function installHooksCommand (line 80) | func installHooksCommand(cmd *cobra.Command, args []string) {
  function init (line 95) | func init() {

FILE: commands/command_lock.go
  function lockCommand (line 21) | func lockCommand(cmd *cobra.Command, args []string) {
  type lockData (line 75) | type lockData struct
  function computeLockData (line 82) | func computeLockData() (*lockData, error) {
  function lockPath (line 113) | func lockPath(data *lockData, file string) (string, error) {
  function init (line 142) | func init() {

FILE: commands/command_locks.go
  function locksCommand (line 20) | func locksCommand(cmd *cobra.Command, args []string) {
  type locksFlags (line 136) | type locksFlags struct
    method Filters (line 160) | func (l *locksFlags) Filters(data *lockData) (map[string]string, error) {
  function init (line 178) | func init() {

FILE: commands/command_logs.go
  function logsCommand (line 13) | func logsCommand(cmd *cobra.Command, args []string) {
  function logsLastCommand (line 19) | func logsLastCommand(cmd *cobra.Command, args []string) {
  function logsShowCommand (line 29) | func logsShowCommand(cmd *cobra.Command, args []string) {
  function logsClearCommand (line 45) | func logsClearCommand(cmd *cobra.Command, args []string) {
  function logsBoomtownCommand (line 54) | func logsBoomtownCommand(cmd *cobra.Command, args []string) {
  function sortedLogs (line 60) | func sortedLogs() []string {
  function init (line 77) | func init() {

FILE: commands/command_ls_files.go
  type lsFilesObject (line 27) | type lsFilesObject struct
  function lsFilesCommand (line 37) | func lsFilesCommand(cmd *cobra.Command, args []string) {
  function fileExistsOfSize (line 183) | func fileExistsOfSize(p *lfs.WrappedPointer) bool {
  function lsFilesMarker (line 189) | func lsFilesMarker(p *lfs.WrappedPointer) string {
  function init (line 196) | func init() {

FILE: commands/command_merge_driver.go
  function mergeDriverCommand (line 24) | func mergeDriverCommand(cmd *cobra.Command, args []string) {
  function processFiles (line 49) | func processFiles(fileSpecifiers map[string]string, program string, outp...
  function mergeCleanup (line 96) | func mergeCleanup(fileSpecifiers map[string]string) {
  function mergeProcessInput (line 103) | func mergeProcessInput(gf *lfs.GitFilter, filename string, fileSpecifier...
  function init (line 138) | func init() {

FILE: commands/command_migrate.go
  function migrate (line 70) | func migrate(args []string, r *githistory.Rewriter, l *tasklog.Logger, o...
  function getObjectDatabase (line 86) | func getObjectDatabase() (*gitobj.ObjectDatabase, error) {
  function rewriteOptions (line 108) | func rewriteOptions(args []string, opts *githistory.RewriteOptions, l *t...
  function isSpecialGitRef (line 130) | func isSpecialGitRef(refspec string) bool {
  function includeExcludeRefs (line 161) | func includeExcludeRefs(l *tasklog.Logger, args []string) (include, excl...
  function getRemoteRefs (line 260) | func getRemoteRefs(l *tasklog.Logger) (map[string][]*git.Ref, error) {
  function fetchRemoteRefs (line 292) | func fetchRemoteRefs(l *tasklog.Logger, remotes []string) error {
  function formatRefName (line 301) | func formatRefName(ref *git.Ref, remote string) string {
  function currentRefToMigrate (line 313) | func currentRefToMigrate() (*git.Ref, error) {
  function getHistoryRewriter (line 329) | func getHistoryRewriter(cmd *cobra.Command, db *gitobj.ObjectDatabase, l...
  function ensureWorkingCopyClean (line 337) | func ensureWorkingCopyClean(in io.Reader, out io.Writer) {
  function init (line 389) | func init() {

FILE: commands/command_migrate_export.go
  function migrateExportCommand (line 20) | func migrateExportCommand(cmd *cobra.Command, args []string) {
  function performForceCheckout (line 178) | func performForceCheckout(l *tasklog.Logger) error {
  function trackedFromExportFilter (line 190) | func trackedFromExportFilter(filter *filepathfilter.Filter) *tools.Order...

FILE: commands/command_migrate_import.go
  function migrateImportCommand (line 26) | func migrateImportCommand(cmd *cobra.Command, args []string) {
  function generateMigrateCommitMessage (line 272) | func generateMigrateCommitMessage(cmd *cobra.Command, patterns string) s...
  function checkoutNonBare (line 283) | func checkoutNonBare(l *tasklog.Logger) error {
  function trackedFromFilter (line 297) | func trackedFromFilter(filter *filepathfilter.Filter) *tools.OrderedSet {
  function trackedFromAttrs (line 322) | func trackedFromAttrs(db *gitobj.ObjectDatabase, t *gitobj.Tree) (*tools...
  function trackedToBlob (line 371) | func trackedToBlob(db *gitobj.ObjectDatabase, patterns *tools.OrderedSet...
  function rewriteTree (line 387) | func rewriteTree(gf *lfs.GitFilter, db *gitobj.ObjectDatabase, root []by...
  function findEntry (line 467) | func findEntry(t *gitobj.Tree, name string) int {

FILE: commands/command_migrate_info.go
  type migrateInfoPointersType (line 23) | type migrateInfoPointersType
  constant migrateInfoPointersFollow (line 26) | migrateInfoPointersFollow   = migrateInfoPointersType(iota)
  constant migrateInfoPointersNoFollow (line 27) | migrateInfoPointersNoFollow = migrateInfoPointersType(iota)
  constant migrateInfoPointersIgnore (line 28) | migrateInfoPointersIgnore   = migrateInfoPointersType(iota)
  function migrateInfoCommand (line 60) | func migrateInfoCommand(cmd *cobra.Command, args []string) {
  type MigrateInfoEntry (line 213) | type MigrateInfoEntry struct
  function findEntryByExtension (line 230) | func findEntryByExtension(exts map[string]*MigrateInfoEntry, path string...
  function MapToEntries (line 253) | func MapToEntries(exts map[string]*MigrateInfoEntry) []*MigrateInfoEntry {
  function removeEmptyEntries (line 264) | func removeEmptyEntries(entries []*MigrateInfoEntry) []*MigrateInfoEntry {
  type EntriesBySize (line 277) | type EntriesBySize
    method Len (line 280) | func (e EntriesBySize) Len() int { return len(e) }
    method Less (line 284) | func (e EntriesBySize) Less(i, j int) bool {
    method Swap (line 293) | func (e EntriesBySize) Swap(i, j int) { e[i], e[j] = e[j], e[i] }
    method Print (line 298) | func (e EntriesBySize) Print(to io.Writer) (int, error) {

FILE: commands/command_pointer.go
  function pointerCommand (line 28) | func pointerCommand(cmd *cobra.Command, args []string) {
  function pointerReader (line 180) | func pointerReader() (io.ReadCloser, error) {
  function init (line 194) | func init() {

FILE: commands/command_post_checkout.go
  function postCheckoutCommand (line 23) | func postCheckoutCommand(cmd *cobra.Command, args []string) {
  function postCheckoutRevChange (line 51) | func postCheckoutRevChange(client *locking.Client, pre, post string) {
  function postCheckoutFileChange (line 69) | func postCheckoutFileChange(client *locking.Client) {
  function init (line 79) | func init() {

FILE: commands/command_post_commit.go
  function postCommitCommand (line 19) | func postCommitCommand(cmd *cobra.Command, args []string) {
  function init (line 52) | func init() {

FILE: commands/command_post_merge.go
  function postMergeCommand (line 15) | func postMergeCommand(cmd *cobra.Command, args []string) {
  function init (line 49) | func init() {

FILE: commands/command_pre_push.go
  function prePushCommand (line 42) | func prePushCommand(cmd *cobra.Command, args []string) {
  function prePushRefs (line 74) | func prePushRefs(r io.Reader) []*git.RefUpdate {
  function decodeRefs (line 100) | func decodeRefs(input string) (*git.Ref, *git.Ref) {
  function init (line 111) | func init() {

FILE: commands/command_prune.go
  function pruneCommand (line 39) | func pruneCommand(cmd *cobra.Command, args []string) {
  type PruneProgressType (line 65) | type PruneProgressType
  constant PruneProgressTypeLocal (line 68) | PruneProgressTypeLocal      = PruneProgressType(iota)
  constant PruneProgressTypeRetain (line 69) | PruneProgressTypeRetain     = PruneProgressType(iota)
  constant PruneProgressTypeVerify (line 70) | PruneProgressTypeVerify     = PruneProgressType(iota)
  constant PruneProgressTypeUnverified (line 71) | PruneProgressTypeUnverified = PruneProgressType(iota)
  type PruneProgress (line 75) | type PruneProgress struct
  type PruneProgressChan (line 79) | type PruneProgressChan
  function prune (line 81) | func prune(fetchPruneConfig lfs.FetchPruneConfig, verifyRemote, verifyUn...
  function logVerboseOutput (line 231) | func logVerboseOutput(logger *tasklog.Logger, verboseOutput []string, nu...
  function pruneGetVerifiedPrunableObjects (line 252) | func pruneGetVerifiedPrunableObjects(prunableObjects []string, reachable...
  function pruneCheckErrors (line 279) | func pruneCheckErrors(taskErrors []error) {
  function pruneTaskDisplayProgress (line 288) | func pruneTaskDisplayProgress(progressChan PruneProgressChan, waitg *syn...
  function pruneTaskCollectRetained (line 323) | func pruneTaskCollectRetained(outRetainedObjects *tools.StringSet, retai...
  function pruneTaskCollectErrors (line 336) | func pruneTaskCollectErrors(outtaskErrors *[]error, errorChan chan error...
  function pruneDeleteFiles (line 344) | func pruneDeleteFiles(prunableObjects []string, logger *tasklog.Logger) {
  function pruneTaskGetLocalObjects (line 377) | func pruneTaskGetLocalObjects(outLocalObjects *[]fs.Object, progChan Pru...
  function pruneTaskGetRetainedAtRef (line 388) | func pruneTaskGetRetainedAtRef(gitscanner *lfs.GitScanner, ref string, r...
  function pruneTaskGetPreviousVersionsOfRef (line 409) | func pruneTaskGetPreviousVersionsOfRef(gitscanner *lfs.GitScanner, ref s...
  function pruneTaskGetRetainedCurrentAndRecentRefs (line 431) | func pruneTaskGetRetainedCurrentAndRecentRefs(gitscanner *lfs.GitScanner...
  function pruneTaskGetRetainedUnpushed (line 487) | func pruneTaskGetRetainedUnpushed(gitscanner *lfs.GitScanner, fetchconf ...
  function pruneTaskGetRetainedWorktree (line 506) | func pruneTaskGetRetainedWorktree(gitscanner *lfs.GitScanner, fetchconf ...
  function pruneTaskGetRetainedStashed (line 548) | func pruneTaskGetRetainedStashed(gitscanner *lfs.GitScanner, retainChan ...
  function pruneTaskGetRetainedIndex (line 567) | func pruneTaskGetRetainedIndex(gitscanner *lfs.GitScanner, ref string, w...
  function pruneTaskGetReachableObjects (line 586) | func pruneTaskGetReachableObjects(gitscanner *lfs.GitScanner, outObjectS...
  function init (line 605) | func init() {

FILE: commands/command_pull.go
  function pullCommand (line 19) | func pullCommand(cmd *cobra.Command, args []string) {
  function pull (line 35) | func pull(filter *filepathfilter.Filter) {
  type pointerMap (line 122) | type pointerMap struct
    method Seen (line 131) | func (m *pointerMap) Seen(p *lfs.WrappedPointer) bool {
    method Add (line 141) | func (m *pointerMap) Add(p *lfs.WrappedPointer) {
    method All (line 147) | func (m *pointerMap) All(oid string) []*lfs.WrappedPointer {
  function newPointerMap (line 127) | func newPointerMap() *pointerMap {
  function init (line 155) | func init() {

FILE: commands/command_push.go
  function pushCommand (line 37) | func pushCommand(cmd *cobra.Command, args []string) {
  function uploadsBetweenRefAndRemote (line 88) | func uploadsBetweenRefAndRemote(ctx *uploadContext, refnames []string) {
  function uploadsWithObjectIDs (line 102) | func uploadsWithObjectIDs(ctx *uploadContext, oids []string) {
  function lfsPushRefs (line 133) | func lfsPushRefs(refnames []string, pushAll bool) ([]*git.RefUpdate, err...
  function init (line 168) | func init() {

FILE: commands/command_smudge.go
  function delayedSmudge (line 32) | func delayedSmudge(gf *lfs.GitFilter, s *git.FilterProcessScanner, to io...
  function smudge (line 101) | func smudge(gf *lfs.GitFilter, to io.Writer, from io.Reader, filename st...
  function smudgeCommand (line 149) | func smudgeCommand(cmd *cobra.Command, args []string) {
  function smudgeFilename (line 171) | func smudgeFilename(args []string) string {
  function possiblyMalformedObjectSize (line 178) | func possiblyMalformedObjectSize(n int64) bool {
  function init (line 182) | func init() {

FILE: commands/command_standalone_file.go
  function standaloneFileCommand (line 11) | func standaloneFileCommand(cmd *cobra.Command, args []string) {
  function init (line 19) | func init() {

FILE: commands/command_status.go
  function statusCommand (line 24) | func statusCommand(cmd *cobra.Command, args []string) {
  function formatBlobInfo (line 93) | func formatBlobInfo(s *lfs.PointerScanner, entry *lfs.DiffIndexEntry) st...
  function blobInfoFrom (line 113) | func blobInfoFrom(s *lfs.PointerScanner, entry *lfs.DiffIndexEntry) (sha...
  function blobInfoTo (line 122) | func blobInfoTo(s *lfs.PointerScanner, entry *lfs.DiffIndexEntry) (sha, ...
  function blobInfo (line 131) | func blobInfo(s *lfs.PointerScanner, blobSha, name string) (sha, from st...
  function scanIndex (line 173) | func scanIndex(ref string) (staged, unstaged []*lfs.DiffIndexEntry, err ...
  function drainScanner (line 199) | func drainScanner(cache map[string]struct{}, scanner *lfs.DiffIndexScann...
  function keyFromEntry (line 219) | func keyFromEntry(e *lfs.DiffIndexEntry) string {
  function statusScanRefRange (line 228) | func statusScanRefRange(ref *git.Ref) {
  type JSONStatusEntry (line 256) | type JSONStatusEntry struct
  type JSONStatus (line 261) | type JSONStatus struct
  function jsonStagedPointers (line 265) | func jsonStagedPointers(scanner *lfs.PointerScanner, ref string) {
  function porcelainStagedPointers (line 302) | func porcelainStagedPointers(ref string) {
  function porcelainStatusLine (line 324) | func porcelainStatusLine(entry *lfs.DiffIndexEntry) string {
  function relativize (line 339) | func relativize(from, to string) string {
  function init (line 368) | func init() {

FILE: commands/command_track.go
  function trackCommand (line 37) | func trackCommand(cmd *cobra.Command, args []string) {
  type PatternData (line 252) | type PatternData struct
  function listPatterns (line 259) | func listPatterns() {
  function getAllKnownPatterns (line 311) | func getAllKnownPatterns() ([]gitattr.AttributePath, error) {
  function getAttributeLineEnding (line 332) | func getAttributeLineEnding(attribs []gitattr.AttributePath) string {
  function blocklistItem (line 343) | func blocklistItem(name string) string {
  function escapeGlobCharacters (line 363) | func escapeGlobCharacters(s string) string {
  function escapeAttrPattern (line 381) | func escapeAttrPattern(s string) string {
  function unescapeAttrPattern (line 396) | func unescapeAttrPattern(escaped string) string {
  function init (line 410) | func init() {

FILE: commands/command_uninstall.go
  function uninstallCommand (line 10) | func uninstallCommand(cmd *cobra.Command, args []string) {
  function uninstallHooksCommand (line 27) | func uninstallHooksCommand(cmd *cobra.Command, args []string) {
  function init (line 35) | func init() {

FILE: commands/command_unlock.go
  type unlockFlags (line 19) | type unlockFlags struct
  type unlockResponse (line 28) | type unlockResponse struct
  function handleUnlockError (line 35) | func handleUnlockError(locks []unlockResponse, id string, path string, e...
  function unlockCommand (line 48) | func unlockCommand(cmd *cobra.Command, args []string) {
  function unlockAbortIfFileModified (line 138) | func unlockAbortIfFileModified(path string) error {
  function unlockAbortIfFileModifiedById (line 166) | func unlockAbortIfFileModifiedById(id string, lockClient *locking.Client...
  function init (line 184) | func init() {

FILE: commands/command_untrack.go
  function untrackCommand (line 15) | func untrackCommand(cmd *cobra.Command, args []string) {
  function removePath (line 59) | func removePath(path string, args []string) bool {
  function init (line 70) | func init() {

FILE: commands/command_update.go
  function updateCommand (line 17) | func updateCommand(cmd *cobra.Command, args []string) {
  function init (line 61) | func init() {

FILE: commands/command_version.go
  function versionCommand (line 12) | func versionCommand(cmd *cobra.Command, args []string) {
  function init (line 20) | func init() {

FILE: commands/commands.go
  constant defaultFilepathFilterCacheSize (line 32) | defaultFilepathFilterCacheSize = 10000
  function getTransferManifest (line 54) | func getTransferManifest() tq.Manifest {
  function getTransferManifestOperationRemote (line 61) | func getTransferManifestOperationRemote(operation, remote string) tq.Man...
  function getAPIClient (line 75) | func getAPIClient() *lfsapi.Client {
  function closeAPIClient (line 89) | func closeAPIClient() error {
  function newLockClient (line 98) | func newLockClient() *locking.Client {
  function newDownloadCheckQueue (line 118) | func newDownloadCheckQueue(manifest tq.Manifest, remote string, options ...
  function newDownloadQueue (line 125) | func newDownloadQueue(manifest tq.Manifest, remote string, options ...tq...
  function currentRemoteRef (line 132) | func currentRemoteRef() *git.Ref {
  function buildFilepathFilter (line 136) | func buildFilepathFilter(config *config.Configuration, includeArg, exclu...
  function buildFilepathFilterWithPatternType (line 140) | func buildFilepathFilterWithPatternType(config *config.Configuration, in...
  function downloadTransfer (line 145) | func downloadTransfer(p *lfs.WrappedPointer) (name, path, oid string, si...
  function getHookInstallSteps (line 151) | func getHookInstallSteps() string {
  function installHooks (line 169) | func installHooks(force bool) error {
  function uninstallHooks (line 185) | func uninstallHooks() error {
  function Error (line 206) | func Error(format string, args ...interface{}) {
  function Print (line 216) | func Print(format string, args ...interface{}) {
  function Exit (line 225) | func Exit(format string, args ...interface{}) {
  function ExitWithError (line 232) | func ExitWithError(err error) {
  function FullError (line 238) | func FullError(err error) {
  function errorWith (line 242) | func errorWith(err error, fatalErrFn func(error, string, ...interface{})...
  function LoggedError (line 257) | func LoggedError(err error, format string, args ...interface{}) {
  function Panic (line 270) | func Panic(err error, format string, args ...interface{}) {
  function Cleanup (line 275) | func Cleanup() {
  function requireStdin (line 281) | func requireStdin(msg string) {
  function requireInRepo (line 297) | func requireInRepo() {
  function requireWorkingCopy (line 307) | func requireWorkingCopy() {
  function setupRepository (line 314) | func setupRepository() {
  function verifyRepositoryVersion (line 328) | func verifyRepositoryVersion() {
  function setupWorkingCopy (line 339) | func setupWorkingCopy() {
  function changeToWorkingCopy (line 346) | func changeToWorkingCopy() {
  function canonicalizeEnvironment (line 367) | func canonicalizeEnvironment() {
  function handlePanic (line 385) | func handlePanic(err error) string {
  function logPanic (line 393) | func logPanic(loggedError error) string {
  function ipAddresses (line 424) | func ipAddresses() []string {
  function logPanicToWriter (line 464) | func logPanicToWriter(w io.Writer, loggedError error, le string) {
  function determineIncludeExcludePaths (line 509) | func determineIncludeExcludePaths(config *config.Configuration, includeA...
  function determineFilepathFilterCache (line 531) | func determineFilepathFilterCache(config *config.Configuration) filepath...
  function buildProgressMeter (line 554) | func buildProgressMeter(dryRun bool, d tq.Direction) *tq.Meter {
  function requireGitVersion (line 562) | func requireGitVersion() {

FILE: commands/commands_test.go
  function TestDetermineIncludeExcludePathsReturnsCleanedPaths (line 19) | func TestDetermineIncludeExcludePathsReturnsCleanedPaths(t *testing.T) {
  function TestDetermineIncludeExcludePathsReturnsEmptyPaths (line 28) | func TestDetermineIncludeExcludePathsReturnsEmptyPaths(t *testing.T) {
  function TestDetermineIncludeExcludePathsReturnsDefaultsWhenAbsent (line 37) | func TestDetermineIncludeExcludePathsReturnsDefaultsWhenAbsent(t *testin...
  function TestDetermineIncludeExcludePathsReturnsNothingWhenAbsent (line 44) | func TestDetermineIncludeExcludePathsReturnsNothingWhenAbsent(t *testing...
  function TestSpecialGitRefsExclusion (line 51) | func TestSpecialGitRefsExclusion(t *testing.T) {

FILE: commands/lockverifier.go
  type verifyState (line 18) | type verifyState
  constant verifyStateUnknown (line 21) | verifyStateUnknown verifyState = iota
  constant verifyStateEnabled (line 22) | verifyStateEnabled
  constant verifyStateDisabled (line 23) | verifyStateDisabled
  function verifyLocksForUpdates (line 26) | func verifyLocksForUpdates(lv *lockVerifier, updates []*git.RefUpdate) {
  type lockVerifier (line 33) | type lockVerifier struct
    method Verify (line 49) | func (lv *lockVerifier) Verify(ref *git.Ref) {
    method addLocks (line 89) | func (lv *lockVerifier) addLocks(ref *git.Ref, locks []locking.Lock, s...
    method Contains (line 102) | func (lv *lockVerifier) Contains(name string) bool {
    method LockedByThem (line 110) | func (lv *lockVerifier) LockedByThem(name string) bool {
    method LockedByUs (line 118) | func (lv *lockVerifier) LockedByUs(name string) bool {
    method UnownedLocks (line 126) | func (lv *lockVerifier) UnownedLocks() []*refLock {
    method HasUnownedLocks (line 130) | func (lv *lockVerifier) HasUnownedLocks() bool {
    method OwnedLocks (line 134) | func (lv *lockVerifier) OwnedLocks() []*refLock {
    method HasOwnedLocks (line 138) | func (lv *lockVerifier) HasOwnedLocks() bool {
    method Enabled (line 142) | func (lv *lockVerifier) Enabled() bool {
    method newRefLocks (line 146) | func (lv *lockVerifier) newRefLocks(ref *git.Ref, l locking.Lock) *ref...
  function newLockVerifier (line 154) | func newLockVerifier(m tq.Manifest) *lockVerifier {
  type refLock (line 176) | type refLock struct
    method Path (line 183) | func (r *refLock) Path() string {
    method Owners (line 192) | func (r *refLock) Owners() string {
    method Add (line 222) | func (r *refLock) Add(ref *git.Ref, l locking.Lock) error {
  function getVerifyStateFor (line 230) | func getVerifyStateFor(rawurl string) verifyState {

FILE: commands/multiwriter.go
  type multiWriter (line 8) | type multiWriter struct
    method Write (line 20) | func (w *multiWriter) Write(p []byte) (n int, err error) {
    method Fd (line 24) | func (w *multiWriter) Fd() uintptr {
  function newMultiWriter (line 13) | func newMultiWriter(f *os.File, writers ...io.Writer) *multiWriter {

FILE: commands/path.go
  function gitLineEnding (line 5) | func gitLineEnding(git env) string {
  type env (line 15) | type env interface

FILE: commands/path_nix.go
  function cleanRootPath (line 7) | func cleanRootPath(pattern string) string {
  function osLineEnding (line 11) | func osLineEnding() string {

FILE: commands/path_windows.go
  function osLineEnding (line 21) | func osLineEnding() string {
  function cleanRootPath (line 40) | func cleanRootPath(pattern string) string {
  function winPathHasDrive (line 61) | func winPathHasDrive(pattern string) bool {

FILE: commands/pointers.go
  function collectPointers (line 5) | func collectPointers(pointerCh *lfs.PointerChannelWrapper) ([]*lfs.Wrapp...

FILE: commands/pull.go
  function newSingleCheckout (line 25) | func newSingleCheckout(gitEnv config.Environment, remote string) abstrac...
  type abstractCheckout (line 48) | type abstractCheckout interface
  type singleCheckout (line 56) | type singleCheckout struct
    method Manifest (line 63) | func (c *singleCheckout) Manifest() tq.Manifest {
    method Skip (line 70) | func (c *singleCheckout) Skip() bool {
    method Run (line 74) | func (c *singleCheckout) Run(p *lfs.WrappedPointer) {
    method RunToPath (line 147) | func (c *singleCheckout) RunToPath(p *lfs.WrappedPointer, path string)...
    method Close (line 152) | func (c *singleCheckout) Close() {
  type noOpCheckout (line 158) | type noOpCheckout struct
    method Manifest (line 163) | func (c *noOpCheckout) Manifest() tq.Manifest {
    method Skip (line 170) | func (c *noOpCheckout) Skip() bool {
    method RunToPath (line 174) | func (c *noOpCheckout) RunToPath(p *lfs.WrappedPointer, path string) e...
    method Run (line 178) | func (c *noOpCheckout) Run(p *lfs.WrappedPointer) {}
    method Close (line 179) | func (c *noOpCheckout) Close()                    {}
  type gitIndexer (line 185) | type gitIndexer struct
    method Add (line 192) | func (i *gitIndexer) Add(path string) error {
    method Output (line 220) | func (i *gitIndexer) Output() string {
    method Close (line 224) | func (i *gitIndexer) Close() error {

FILE: commands/run.go
  function NewCommand (line 31) | func NewCommand(name string, runFn func(*cobra.Command, []string)) *cobr...
  function RegisterCommand (line 43) | func RegisterCommand(name string, runFn func(cmd *cobra.Command, args []...
  function Run (line 59) | func Run() int {
  function gitlfsCommand (line 163) | func gitlfsCommand(cmd *cobra.Command, args []string) {
  function helpCommand (line 170) | func helpCommand(cmd *cobra.Command, args []string) {
  function usageCommand (line 178) | func usageCommand(cmd *cobra.Command) error {
  function printHelp (line 183) | func printHelp(commandName string) {
  function setupHTTPLogger (line 195) | func setupHTTPLogger(cmd *cobra.Command, args []string) {

FILE: commands/uploader.go
  function uploadForRefUpdates (line 20) | func uploadForRefUpdates(ctx *uploadContext, updates []*git.RefUpdate, p...
  function uploadRangeOrAll (line 48) | func uploadRangeOrAll(g *lfs.GitScanner, ctx *uploadContext, q *tq.Trans...
  type uploadContext (line 62) | type uploadContext struct
    method NewQueue (line 121) | func (c *uploadContext) NewQueue(options ...tq.Option) *tq.TransferQue...
    method scannerError (line 129) | func (c *uploadContext) scannerError() error {
    method addScannerError (line 136) | func (c *uploadContext) addScannerError(err error) {
    method buildGitScanner (line 143) | func (c *uploadContext) buildGitScanner() *lfs.GitScanner {
    method gitScannerCallback (line 147) | func (c *uploadContext) gitScannerCallback(tqueue *tq.TransferQueue) f...
    method SetUploaded (line 159) | func (c *uploadContext) SetUploaded(oid string) {
    method HasUploaded (line 165) | func (c *uploadContext) HasUploaded(oid string) bool {
    method prepareUpload (line 169) | func (c *uploadContext) prepareUpload(unfiltered ...*lfs.WrappedPointe...
    method UploadPointers (line 220) | func (c *uploadContext) UploadPointers(q *tq.TransferQueue, unfiltered...
    method CollectErrors (line 246) | func (c *uploadContext) CollectErrors(tqueue *tq.TransferQueue) {
    method ReportErrors (line 262) | func (c *uploadContext) ReportErrors() {
    method uploadTransfer (line 334) | func (c *uploadContext) uploadTransfer(p *lfs.WrappedPointer) (*tq.Tra...
  function newUploadContext (line 91) | func newUploadContext(dryRun bool) *uploadContext {
  function supportsLockingAPI (line 367) | func supportsLockingAPI(rawurl string) bool {
  function disableFor (line 386) | func disableFor(rawurl string) error {

FILE: commands/uploader_test.go
  type LockingSupportTestCase (line 9) | type LockingSupportTestCase struct
    method Assert (line 14) | func (l *LockingSupportTestCase) Assert(t *testing.T) {
  function TestSupportedLockingHosts (line 18) | func TestSupportedLockingHosts(t *testing.T) {

FILE: config/config.go
  type Configuration (line 30) | type Configuration struct
    method getMask (line 91) | func (c *Configuration) getMask() int {
    method readGitConfig (line 123) | func (c *Configuration) readGitConfig(gitconfigs ...*git.Configuration...
    method BasicTransfersOnly (line 184) | func (c *Configuration) BasicTransfersOnly() bool {
    method TusTransfersAllowed (line 190) | func (c *Configuration) TusTransfersAllowed() bool {
    method TransferBatchSize (line 194) | func (c *Configuration) TransferBatchSize() int {
    method FetchIncludePaths (line 198) | func (c *Configuration) FetchIncludePaths() []string {
    method FetchExcludePaths (line 203) | func (c *Configuration) FetchExcludePaths() []string {
    method CurrentRef (line 208) | func (c *Configuration) CurrentRef() *git.Ref {
    method IsDefaultRemote (line 223) | func (c *Configuration) IsDefaultRemote() bool {
    method AutoDetectRemoteEnabled (line 227) | func (c *Configuration) AutoDetectRemoteEnabled() bool {
    method SearchAllRemotesEnabled (line 231) | func (c *Configuration) SearchAllRemotesEnabled() bool {
    method Remote (line 241) | func (c *Configuration) Remote() string {
    method PushRemote (line 265) | func (c *Configuration) PushRemote() string {
    method SetValidRemote (line 289) | func (c *Configuration) SetValidRemote(name string) error {
    method SetValidPushRemote (line 300) | func (c *Configuration) SetValidPushRemote(name string) error {
    method SetRemote (line 311) | func (c *Configuration) SetRemote(name string) {
    method SetPushRemote (line 315) | func (c *Configuration) SetPushRemote(name string) {
    method Remotes (line 319) | func (c *Configuration) Remotes() []string {
    method Extensions (line 324) | func (c *Configuration) Extensions() map[string]Extension {
    method SortedExtensions (line 330) | func (c *Configuration) SortedExtensions() ([]Extension, error) {
    method SkipDownloadErrors (line 334) | func (c *Configuration) SkipDownloadErrors() bool {
    method SetLockableFilesReadOnly (line 338) | func (c *Configuration) SetLockableFilesReadOnly() bool {
    method ForceProgress (line 342) | func (c *Configuration) ForceProgress() bool {
    method HookDir (line 349) | func (c *Configuration) HookDir() (string, error) {
    method InRepo (line 366) | func (c *Configuration) InRepo() bool {
    method LocalWorkingDir (line 370) | func (c *Configuration) LocalWorkingDir() string {
    method LocalGitDir (line 375) | func (c *Configuration) LocalGitDir() string {
    method loadGitDirs (line 380) | func (c *Configuration) loadGitDirs() {
    method LocalGitStorageDir (line 403) | func (c *Configuration) LocalGitStorageDir() string {
    method LocalReferenceDirs (line 407) | func (c *Configuration) LocalReferenceDirs() []string {
    method LFSStorageDir (line 411) | func (c *Configuration) LFSStorageDir() string {
    method LFSObjectDir (line 415) | func (c *Configuration) LFSObjectDir() string {
    method LFSObjectExists (line 419) | func (c *Configuration) LFSObjectExists(oid string, size int64) bool {
    method EachLFSObject (line 423) | func (c *Configuration) EachLFSObject(fn func(fs.Object) error) error {
    method LocalLogDir (line 427) | func (c *Configuration) LocalLogDir() string {
    method TempDir (line 431) | func (c *Configuration) TempDir() string {
    method Filesystem (line 435) | func (c *Configuration) Filesystem() *fs.Filesystem {
    method Cleanup (line 454) | func (c *Configuration) Cleanup() error {
    method OSEnv (line 463) | func (c *Configuration) OSEnv() Environment {
    method GitEnv (line 467) | func (c *Configuration) GitEnv() Environment {
    method GitConfig (line 471) | func (c *Configuration) GitConfig() *git.Configuration {
    method FindGitGlobalKey (line 475) | func (c *Configuration) FindGitGlobalKey(key string) string {
    method FindGitSystemKey (line 479) | func (c *Configuration) FindGitSystemKey(key string) string {
    method FindGitLocalKey (line 483) | func (c *Configuration) FindGitLocalKey(key string) string {
    method FindGitWorktreeKey (line 487) | func (c *Configuration) FindGitWorktreeKey(key string) string {
    method SetGitGlobalKey (line 491) | func (c *Configuration) SetGitGlobalKey(key, val string) (string, erro...
    method SetGitSystemKey (line 495) | func (c *Configuration) SetGitSystemKey(key, val string) (string, erro...
    method SetGitLocalKey (line 499) | func (c *Configuration) SetGitLocalKey(key, val string) (string, error) {
    method SetGitWorktreeKey (line 503) | func (c *Configuration) SetGitWorktreeKey(key, val string) (string, er...
    method UnsetGitGlobalSection (line 507) | func (c *Configuration) UnsetGitGlobalSection(key string) (string, err...
    method UnsetGitSystemSection (line 511) | func (c *Configuration) UnsetGitSystemSection(key string) (string, err...
    method UnsetGitLocalSection (line 515) | func (c *Configuration) UnsetGitLocalSection(key string) (string, erro...
    method UnsetGitWorktreeSection (line 519) | func (c *Configuration) UnsetGitWorktreeSection(key string) (string, e...
    method UnsetGitLocalKey (line 523) | func (c *Configuration) UnsetGitLocalKey(key string) (string, error) {
    method loadGitConfig (line 538) | func (c *Configuration) loadGitConfig() {
    method findUserData (line 577) | func (c *Configuration) findUserData(envType string) (name, email stri...
    method findUserTimestamp (line 608) | func (c *Configuration) findUserTimestamp(envType string) time.Time {
    method CurrentCommitter (line 642) | func (c *Configuration) CurrentCommitter() (name, email string) {
    method CurrentCommitterTimestamp (line 648) | func (c *Configuration) CurrentCommitterTimestamp() time.Time {
    method CurrentAuthor (line 655) | func (c *Configuration) CurrentAuthor() (name, email string) {
    method CurrentAuthorTimestamp (line 661) | func (c *Configuration) CurrentAuthorTimestamp() time.Time {
    method RepositoryPermissions (line 667) | func (c *Configuration) RepositoryPermissions(executable bool) os.File...
  function New (line 62) | func New() *Configuration {
  function NewIn (line 66) | func NewIn(workdir, gitdir string) *Configuration {
  type Values (line 137) | type Values struct
  function NewFrom (line 148) | func NewFrom(v Values) *Configuration {

FILE: config/config_test.go
  function TestRemoteDefault (line 12) | func TestRemoteDefault(t *testing.T) {
  function TestRemoteBranchConfig (line 23) | func TestRemoteBranchConfig(t *testing.T) {
  function TestRemotePushDefault (line 36) | func TestRemotePushDefault(t *testing.T) {
  function TestRemoteBranchPushDefault (line 50) | func TestRemoteBranchPushDefault(t *testing.T) {
  function TestLFSDefault (line 64) | func TestLFSDefault(t *testing.T) {
  function TestLFSDefaultSimple (line 77) | func TestLFSDefaultSimple(t *testing.T) {
  function TestLFSDefaultBranch (line 88) | func TestLFSDefaultBranch(t *testing.T) {
  function TestBasicTransfersOnlySetValue (line 104) | func TestBasicTransfersOnlySetValue(t *testing.T) {
  function TestBasicTransfersOnlyDefault (line 115) | func TestBasicTransfersOnlyDefault(t *testing.T) {
  function TestBasicTransfersOnlyInvalidValue (line 122) | func TestBasicTransfersOnlyInvalidValue(t *testing.T) {
  function TestTusTransfersAllowedSetValue (line 133) | func TestTusTransfersAllowedSetValue(t *testing.T) {
  function TestTusTransfersAllowedDefault (line 144) | func TestTusTransfersAllowedDefault(t *testing.T) {
  function TestTusTransfersAllowedInvalidValue (line 151) | func TestTusTransfersAllowedInvalidValue(t *testing.T) {
  function TestLoadValidExtension (line 162) | func TestLoadValidExtension(t *testing.T) {
  function TestLoadInvalidExtension (line 179) | func TestLoadInvalidExtension(t *testing.T) {
  function TestFetchIncludeExcludesAreCleaned (line 189) | func TestFetchIncludeExcludesAreCleaned(t *testing.T) {
  function TestRepositoryPermissions (line 201) | func TestRepositoryPermissions(t *testing.T) {
  function TestRepositoryPermissionsExectable (line 235) | func TestRepositoryPermissionsExectable(t *testing.T) {
  function TestCurrentUser (line 269) | func TestCurrentUser(t *testing.T) {
  function TestCurrentTimestamp (line 334) | func TestCurrentTimestamp(t *testing.T) {
  function TestRemoteNameWithDotDefault (line 374) | func TestRemoteNameWithDotDefault(t *testing.T) {

FILE: config/delayed_environment.go
  type delayedEnvironment (line 12) | type delayedEnvironment struct
    method Get (line 20) | func (e *delayedEnvironment) Get(key string) (string, bool) {
    method GetAll (line 27) | func (e *delayedEnvironment) GetAll(key string) []string {
    method Bool (line 34) | func (e *delayedEnvironment) Bool(key string, def bool) bool {
    method Int (line 41) | func (e *delayedEnvironment) Int(key string, def int) int {
    method Int64 (line 48) | func (e *delayedEnvironment) Int64(key string, def int64) int64 {
    method All (line 54) | func (e *delayedEnvironment) All() map[string][]string {
    method Load (line 66) | func (e *delayedEnvironment) Load() {

FILE: config/environment.go
  type Environment (line 14) | type Environment interface
  type environment (line 60) | type environment struct
    method Get (line 71) | func (e *environment) Get(key string) (val string, ok bool) {
    method GetAll (line 75) | func (e *environment) GetAll(key string) []string {
    method Bool (line 79) | func (e *environment) Bool(key string, def bool) bool {
    method Int (line 84) | func (e *environment) Int(key string, def int) int {
    method Int64 (line 89) | func (e *environment) Int64(key string, def int64) int64 {
    method All (line 94) | func (e *environment) All() map[string][]string {
  function EnvironmentOf (line 67) | func EnvironmentOf(f Fetcher) Environment {
  function Int (line 107) | func Int(value string, def int) int {
  function Int64 (line 129) | func Int64(value string, def int64) int64 {
  function Bool (line 152) | func Bool(value string, def bool) bool {

FILE: config/environment_test.go
  function TestEnvironmentGetDelegatesToFetcher (line 10) | func TestEnvironmentGetDelegatesToFetcher(t *testing.T) {
  function TestEnvironmentGetAllDelegatesToFetcher (line 22) | func TestEnvironmentGetAllDelegatesToFetcher(t *testing.T) {
  function TestEnvironmentUnsetBoolDefault (line 33) | func TestEnvironmentUnsetBoolDefault(t *testing.T) {
  function TestEnvironmentBoolTruthyConversion (line 38) | func TestEnvironmentBoolTruthyConversion(t *testing.T) {
  function TestEnvironmentIntTestCases (line 58) | func TestEnvironmentIntTestCases(t *testing.T) {
  type EnvironmentConversionTestCase (line 71) | type EnvironmentConversionTestCase struct
    method Assert (line 92) | func (c *EnvironmentConversionTestCase) Assert(t *testing.T) {

FILE: config/extension.go
  type Extension (line 12) | type Extension struct
  function SortExtensions (line 20) | func SortExtensions(m map[string]Extension) ([]Extension, error) {

FILE: config/extension_test.go
  function TestSortExtensions (line 9) | func TestSortExtensions(t *testing.T) {
  function TestSortExtensionsDuplicatePriority (line 46) | func TestSortExtensionsDuplicatePriority(t *testing.T) {

FILE: config/fetcher.go
  type Fetcher (line 6) | type Fetcher interface

FILE: config/git_fetcher.go
  type GitFetcher (line 14) | type GitFetcher struct
    method Get (line 125) | func (g *GitFetcher) Get(key string) (val string, ok bool) {
    method GetAll (line 134) | func (g *GitFetcher) GetAll(key string) []string {
    method All (line 141) | func (g *GitFetcher) All() map[string][]string {
    method caseFoldKey (line 156) | func (g *GitFetcher) caseFoldKey(key string) string {
  function readGitConfig (line 19) | func readGitConfig(configs ...*git.ConfigurationSource) (gf *GitFetcher,...
  function keyIsUnsafe (line 177) | func keyIsUnsafe(key string) bool {

FILE: config/git_fetcher_test.go
  function TestGetCanonicalization (line 9) | func TestGetCanonicalization(t *testing.T) {

FILE: config/map_fetcher.go
  type mapFetcher (line 5) | type mapFetcher
    method Get (line 21) | func (m mapFetcher) Get(key string) (val string, ok bool) {
    method GetAll (line 31) | func (m mapFetcher) GetAll(key string) []string {
    method All (line 35) | func (m mapFetcher) All() map[string][]string {
  function UniqMapFetcher (line 7) | func UniqMapFetcher(m map[string]string) Fetcher {
  function MapFetcher (line 16) | func MapFetcher(m map[string][]string) Fetcher {

FILE: config/os_fetcher.go
  type OsFetcher (line 12) | type OsFetcher struct
    method Get (line 36) | func (o *OsFetcher) Get(key string) (val string, ok bool) {
    method GetAll (line 59) | func (o *OsFetcher) GetAll(key string) []string {
    method All (line 66) | func (o *OsFetcher) All() map[string][]string {
  function NewOsFetcher (line 21) | func NewOsFetcher() *OsFetcher {

FILE: config/url_config.go
  type URLConfig (line 10) | type URLConfig struct
    method Get (line 28) | func (c *URLConfig) Get(prefix, rawurl, key string) (string, bool) {
    method GetAll (line 41) | func (c *URLConfig) GetAll(prefix, rawurl, key string) []string {
    method Bool (line 54) | func (c *URLConfig) Bool(prefix, rawurl, key string, def bool) bool {
    method getAll (line 59) | func (c *URLConfig) getAll(prefix, rawurl, key string) []string {
    method hostsAndPaths (line 253) | func (c *URLConfig) hostsAndPaths(rawurl string) (hosts, paths []strin...
    method hosts (line 262) | func (c *URLConfig) hosts(u *url.URL) []string {
    method paths (line 273) | func (c *URLConfig) paths(path string) []string {
  function NewURLConfig (line 14) | func NewURLConfig(git Environment) *URLConfig {
  function portForURL (line 168) | func portForURL(u *url.URL) string {
  function compareHosts (line 188) | func compareHosts(searchHostname, configHostname string) int {
  function comparePaths (line 215) | func comparePaths(rawSearchPath, rawConfigPath string) int {
  constant gitExt (line 287) | gitExt   = ".git"
  constant infoPart (line 288) | infoPart = "info"
  constant lfsPart (line 289) | lfsPart  = "lfs"
  constant slash (line 290) | slash    = "/"
  function isDefaultLFSUrl (line 293) | func isDefaultLFSUrl(path string, parts []string, index int) bool {

FILE: config/url_config_test.go
  function TestURLConfig (line 9) | func TestURLConfig(t *testing.T) {

FILE: config/util_nix.go
  function umask (line 8) | func umask() int {

FILE: config/util_windows.go
  function umask (line 8) | func umask() int {

FILE: config/version.go
  constant Version (line 16) | Version = "3.7.0"
  function init (line 19) | func init() {

FILE: creds/access.go
  type AccessMode (line 3) | type AccessMode
  constant NoneAccess (line 6) | NoneAccess      AccessMode = "none"
  constant BasicAccess (line 7) | BasicAccess     AccessMode = "basic"
  constant PrivateAccess (line 8) | PrivateAccess   AccessMode = "private"
  constant NegotiateAccess (line 9) | NegotiateAccess AccessMode = "negotiate"
  constant EmptyAccess (line 10) | EmptyAccess     AccessMode = ""
  type Access (line 13) | type Access struct
    method Upgrade (line 23) | func (a *Access) Upgrade(newMode AccessMode) Access {
    method Mode (line 27) | func (a *Access) Mode() AccessMode {
    method URL (line 31) | func (a *Access) URL() string {
  function NewAccess (line 18) | func NewAccess(mode AccessMode, url string) Access {
  function AllAccessModes (line 36) | func AllAccessModes() []AccessMode {

FILE: creds/creds.go
  type CredentialHelperWrapper (line 22) | type CredentialHelperWrapper struct
    method FillCreds (line 38) | func (credWrapper *CredentialHelperWrapper) FillCreds() error {
  type CredentialHelper (line 32) | type CredentialHelper interface
  type Creds (line 55) | type Creds
    method IsMultistage (line 57) | func (c Creds) IsMultistage() bool {
    method buffer (line 61) | func (c Creds) buffer(protectProtocol bool) (*bytes.Buffer, error) {
  type CredentialHelperContext (line 88) | type CredentialHelperContext struct
    method SetWWWAuthHeaders (line 135) | func (ctxt *CredentialHelperContext) SetWWWAuthHeaders(headers []strin...
    method SetStateFields (line 139) | func (ctxt *CredentialHelperContext) SetStateFields(fields []string) {
    method GetCredentialHelper (line 148) | func (ctxt *CredentialHelperContext) GetCredentialHelper(helper Creden...
  function NewCredentialHelperContext (line 99) | func NewCredentialHelperContext(gitEnv config.Environment, osEnv config....
  type AskPassCredentialHelper (line 189) | type AskPassCredentialHelper struct
    method Fill (line 213) | func (a *AskPassCredentialHelper) Fill(what Creds) (Creds, error) {
    method getValue (line 243) | func (a *AskPassCredentialHelper) getValue(what Creds, valueType credV...
    method getFromProgram (line 263) | func (a *AskPassCredentialHelper) getFromProgram(valueType credValueTy...
    method Approve (line 304) | func (a *AskPassCredentialHelper) Approve(_ Creds) error { return nil }
    method Reject (line 308) | func (a *AskPassCredentialHelper) Reject(_ Creds) error { return nil }
    method args (line 315) | func (a *AskPassCredentialHelper) args(prompt string) []string {
  type credValueType (line 194) | type credValueType
  constant credValueTypeUnknown (line 197) | credValueTypeUnknown credValueType = iota
  constant credValueTypeUsername (line 198) | credValueTypeUsername
  constant credValueTypePassword (line 199) | credValueTypePassword
  type commandCredentialHelper (line 322) | type commandCredentialHelper struct
    method Fill (line 327) | func (h *commandCredentialHelper) Fill(creds Creds) (Creds, error) {
    method Reject (line 335) | func (h *commandCredentialHelper) Reject(creds Creds) error {
    method Approve (line 340) | func (h *commandCredentialHelper) Approve(creds Creds) error {
    method exec (line 349) | func (h *commandCredentialHelper) exec(subcommand string, input Creds)...
  type credentialCacher (line 410) | type credentialCacher struct
    method Fill (line 428) | func (c *credentialCacher) Fill(what Creds) (Creds, error) {
    method Approve (line 445) | func (c *credentialCacher) Approve(what Creds) error {
    method Reject (line 459) | func (c *credentialCacher) Reject(what Creds) error {
  function NewCredentialCacher (line 415) | func NewCredentialCacher() *credentialCacher {
  function credCacheKey (line 419) | func credCacheKey(creds Creds) string {
  type CredentialHelpers (line 476) | type CredentialHelpers struct
    method Fill (line 502) | func (s *CredentialHelpers) Fill(what Creds) (Creds, error) {
    method Reject (line 533) | func (s *CredentialHelpers) Reject(what Creds) error {
    method Approve (line 552) | func (s *CredentialHelpers) Approve(what Creds) error {
    method skip (line 575) | func (s *CredentialHelpers) skip(i int) {
    method skipped (line 581) | func (s *CredentialHelpers) skipped(i int) bool {
  function NewCredentialHelpers (line 484) | func NewCredentialHelpers(helpers []CredentialHelper) CredentialHelper {
  type nullCredentialHelper (line 588) | type nullCredentialHelper struct
    method Fill (line 595) | func (h *nullCredentialHelper) Fill(input Creds) (Creds, error) {
    method Approve (line 599) | func (h *nullCredentialHelper) Approve(creds Creds) error {
    method Reject (line 603) | func (h *nullCredentialHelper) Reject(creds Creds) error {
  function FirstEntryForKey (line 609) | func FirstEntryForKey(input Creds, key string) string {

FILE: creds/creds_test.go
  function assertCredsLinesMatch (line 13) | func assertCredsLinesMatch(t *testing.T, expected []string, buf *bytes.B...
  function TestCredsBufferFormat (line 23) | func TestCredsBufferFormat(t *testing.T) {
  function TestCredsBufferProtect (line 54) | func TestCredsBufferProtect(t *testing.T) {
  type testCredHelper (line 99) | type testCredHelper struct
    method Fill (line 116) | func (h *testCredHelper) Fill(input Creds) (Creds, error) {
    method Approve (line 121) | func (h *testCredHelper) Approve(creds Creds) error {
    method Reject (line 126) | func (h *testCredHelper) Reject(creds Creds) error {
  function newTestCredHelper (line 108) | func newTestCredHelper() *testCredHelper {
  function TestCredHelperSetNoErrors (line 131) | func TestCredHelperSetNoErrors(t *testing.T) {
  function TestCredHelperSetFillError (line 192) | func TestCredHelperSetFillError(t *testing.T) {
  function TestCredHelperSetApproveError (line 231) | func TestCredHelperSetApproveError(t *testing.T) {
  function TestCredHelperSetFillAndApproveError (line 262) | func TestCredHelperSetFillAndApproveError(t *testing.T) {
  function TestCredHelperSetRejectError (line 292) | func TestCredHelperSetRejectError(t *testing.T) {
  function TestCredHelperSetAllFillErrors (line 330) | func TestCredHelperSetAllFillErrors(t *testing.T) {

FILE: creds/netrc.go
  type NetrcFinder (line 16) | type NetrcFinder interface
  constant netrcBasename (line 20) | netrcBasename = ".netrc"
  constant netrcAltBasename (line 21) | netrcAltBasename = "_netrc"
  function ParseNetrc (line 23) | func ParseNetrc(osEnv config.Environment) (NetrcFinder, string, error) {
  type noFinder (line 47) | type noFinder struct
    method FindMachine (line 49) | func (f *noFinder) FindMachine(host string, loginName string) *netrc.M...
  type netrcCredentialHelper (line 54) | type netrcCredentialHelper struct
    method Fill (line 78) | func (c *netrcCredentialHelper) Fill(what Creds) (Creds, error) {
    method Approve (line 120) | func (c *netrcCredentialHelper) Approve(what Creds) error {
    method Reject (line 138) | func (c *netrcCredentialHelper) Reject(what Creds) error {
  function newNetrcCredentialHelper (line 64) | func newNetrcCredentialHelper(osEnv config.Environment) *netrcCredential...
  function getNetrcHostname (line 107) | func getNetrcHostname(hostname string) (string, error) {

FILE: creds/netrc_test.go
  function TestNetrcWithHostAndPort (line 10) | func TestNetrcWithHostAndPort(t *testing.T) {
  function TestNetrcWithHost (line 35) | func TestNetrcWithHost(t *testing.T) {
  function TestNetrcWithBadHost (line 60) | func TestNetrcWithBadHost(t *testing.T) {
  type fakeNetrc (line 75) | type fakeNetrc struct
    method FindMachine (line 77) | func (n *fakeNetrc) FindMachine(host string, loginName string) *netrc....

FILE: docs/man/asciidoctor-extensions/manpage-extension.rb
  type GitLFS (line 5) | module GitLFS
    type Documentation (line 6) | module Documentation
      class GitLFSManPageConverter (line 7) | class GitLFSManPageConverter < Asciidoctor::Converter::ManPageConverter
        method convert_listing (line 12) | def convert_listing node

FILE: docs/man/mangen.go
  function infof (line 14) | func infof(w io.Writer, format string, a ...interface{}) {
  function warnf (line 21) | func warnf(w io.Writer, format string, a ...interface{}) {
  function readManDir (line 25) | func readManDir() (string, []os.DirEntry) {
  function titleizeXref (line 44) | func titleizeXref(s string) string {
  function main (line 57) | func main() {

FILE: errors/context.go
  type withContext (line 3) | type withContext interface
  function SetContext (line 12) | func SetContext(err error, key string, value interface{}) {
  function GetContext (line 20) | func GetContext(err error, key string) interface{} {
  function DelContext (line 29) | func DelContext(err error, key string) {
  function Context (line 37) | func Context(err error) map[string]interface{} {

FILE: errors/errors.go
  function New (line 61) | func New(message string) error {
  function Errorf (line 68) | func Errorf(format string, args ...interface{}) error {
  function Wrap (line 73) | func Wrap(err error, msg string) error {
  function Wrapf (line 78) | func Wrapf(err error, format string, args ...interface{}) error {
  function Join (line 88) | func Join(errs ...error) error {
  function Cause (line 92) | func Cause(err error) error {

FILE: errors/errors_test.go
  function TestChecksHandleGoErrors (line 8) | func TestChecksHandleGoErrors(t *testing.T) {
  function TestCheckHandlesWrappedErrors (line 16) | func TestCheckHandlesWrappedErrors(t *testing.T) {
  function TestBehaviorWraps (line 26) | func TestBehaviorWraps(t *testing.T) {
  function TestContextOnGoErrors (line 45) | func TestContextOnGoErrors(t *testing.T) {
  function TestContextOnWrappedErrors (line 56) | func TestContextOnWrappedErrors(t *testing.T) {

FILE: errors/types.go
  function IsFatalError (line 18) | func IsFatalError(err error) bool {
  function IsNotImplementedError (line 32) | func IsNotImplementedError(err error) bool {
  function IsAuthError (line 46) | func IsAuthError(err error) bool {
  function IsSmudgeError (line 59) | func IsSmudgeError(err error) bool {
  function IsCleanPointerError (line 72) | func IsCleanPointerError(err error) bool {
  function IsNotAPointerError (line 85) | func IsNotAPointerError(err error) bool {
  function IsPointerScanError (line 98) | func IsPointerScanError(err error) bool {
  function IsBadPointerKeyError (line 111) | func IsBadPointerKeyError(err error) bool {
  function IsProtocolError (line 125) | func IsProtocolError(err error) bool {
  function StandardizeBadPointerError (line 139) | func StandardizeBadPointerError(err error) error {
  function IsDownloadDeclinedError (line 151) | func IsDownloadDeclinedError(err error) bool {
  function IsUnprocessableEntityError (line 165) | func IsUnprocessableEntityError(err error) bool {
  function IsRetriableError (line 179) | func IsRetriableError(err error) bool {
  function IsRetriableLaterError (line 194) | func IsRetriableLaterError(err error) (time.Time, bool) {
  type errorWithCause (line 206) | type errorWithCause interface
  type wrappedError (line 214) | type wrappedError struct
    method Set (line 242) | func (e wrappedError) Set(key string, val interface{}) {
    method Get (line 247) | func (e wrappedError) Get(key string) interface{} {
    method Del (line 252) | func (e wrappedError) Del(key string) {
    method Context (line 257) | func (e wrappedError) Context() map[string]interface{} {
  function newWrappedError (line 220) | func newWrappedError(err error, message string) *wrappedError {
  type fatalError (line 263) | type fatalError struct
    method Fatal (line 267) | func (e fatalError) Fatal() bool {
  function NewFatalError (line 271) | func NewFatalError(err error) error {
  type notImplementedError (line 277) | type notImplementedError struct
    method NotImplemented (line 281) | func (e notImplementedError) NotImplemented() bool {
  function NewNotImplementedError (line 285) | func NewNotImplementedError(err error) error {
  type authError (line 291) | type authError struct
    method AuthError (line 295) | func (e authError) AuthError() bool {
  function NewAuthError (line 299) | func NewAuthError(err error) error {
  type smudgeError (line 305) | type smudgeError struct
    method SmudgeError (line 309) | func (e smudgeError) SmudgeError() bool {
  function NewSmudgeError (line 313) | func NewSmudgeError(err error, oid, filename string) error {
  type cleanPointerError (line 322) | type cleanPointerError struct
    method CleanPointerError (line 326) | func (e cleanPointerError) CleanPointerError() bool {
  function NewCleanPointerError (line 330) | func NewCleanPointerError(pointer interface{}, bytes []byte) error {
  type notAPointerError (line 340) | type notAPointerError struct
    method NotAPointerError (line 344) | func (e notAPointerError) NotAPointerError() bool {
  function NewNotAPointerError (line 348) | func NewNotAPointerError(err error) error {
  type PointerScanError (line 354) | type PointerScanError struct
    method PointerScanError (line 360) | func (e PointerScanError) PointerScanError() bool {
    method OID (line 364) | func (e PointerScanError) OID() string {
    method Path (line 368) | func (e PointerScanError) Path() string {
  function NewPointerScanError (line 372) | func NewPointerScanError(err error, treeishOid, path string) error {
  type badPointerKeyError (line 376) | type badPointerKeyError struct
    method BadPointerKeyError (line 383) | func (e badPointerKeyError) BadPointerKeyError() bool {
  function NewBadPointerKeyError (line 387) | func NewBadPointerKeyError(expected, actual string) error {
  type downloadDeclinedError (line 394) | type downloadDeclinedError struct
    method DownloadDeclinedError (line 398) | func (e downloadDeclinedError) DownloadDeclinedError() bool {
  function NewDownloadDeclinedError (line 402) | func NewDownloadDeclinedError(err error, msg string) error {
  type retriableLaterError (line 408) | type retriableLaterError struct
    method RetriableLaterError (line 438) | func (e retriableLaterError) RetriableLaterError() (time.Time, bool) {
  function NewRetriableLaterError (line 413) | func NewRetriableLaterError(err error, header string) error {
  type unprocessableEntityError (line 444) | type unprocessableEntityError struct
    method UnprocessableEntityError (line 448) | func (e unprocessableEntityError) UnprocessableEntityError() bool {
  function NewUnprocessableEntityError (line 452) | func NewUnprocessableEntityError(err error) error {
  type retriableError (line 458) | type retriableError struct
    method RetriableError (line 462) | func (e retriableError) RetriableError() bool {
  function NewRetriableError (line 466) | func NewRetriableError(err error) error {
  type protocolError (line 472) | type protocolError struct
    method ProtocolError (line 476) | func (e protocolError) ProtocolError() bool {
  function NewProtocolError (line 480) | func NewProtocolError(message string, err error) error {
  function parentOf (line 484) | func parentOf(err error) error {
  function ExitStatus (line 498) | func ExitStatus(err error) int {

FILE: errors/types_test.go
  type TemporaryError (line 11) | type TemporaryError struct
    method Error (line 14) | func (e TemporaryError) Error() string {
    method Temporary (line 18) | func (e TemporaryError) Temporary() bool {
  type TimeoutError (line 22) | type TimeoutError struct
    method Error (line 25) | func (e TimeoutError) Error() string {
    method Timeout (line 29) | func (e TimeoutError) Timeout() bool {
  function TestCanRetryOnTemporaryError (line 33) | func TestCanRetryOnTemporaryError(t *testing.T) {
  function TestCanRetryOnTimeoutError (line 38) | func TestCanRetryOnTimeoutError(t *testing.T) {
  function TestCannotRetryOnGenericUrlError (line 43) | func TestCannotRetryOnGenericUrlError(t *testing.T) {

FILE: filepathfilter/filepathfilter.go
  type Pattern (line 13) | type Pattern interface
  type Filter (line 20) | type Filter struct
    method Include (line 94) | func (f *Filter) Include() []string { return wildmatchToString(f.inclu...
    method Exclude (line 98) | func (f *Filter) Exclude() []string { return wildmatchToString(f.exclu...
    method allows (line 111) | func (f *Filter) allows(filename string) bool {
    method Allows (line 145) | func (f *Filter) Allows(filename string) bool {
  type PatternType (line 28) | type PatternType
    method String (line 35) | func (p PatternType) String() string {
  constant GitIgnore (line 31) | GitIgnore     = PatternType(false)
  constant GitAttributes (line 32) | GitAttributes = PatternType(true)
  type options (line 42) | type options struct
  type Option (line 48) | type Option
  function DefaultValue (line 52) | func DefaultValue(val bool) Option {
  function EnableCache (line 58) | func EnableCache(size int) Option {
  function DisableCache (line 65) | func DisableCache() Option {
  function NewFromPatterns (line 71) | func NewFromPatterns(include, exclude []Pattern, setters ...Option) *Fil...
  function New (line 86) | func New(include, exclude []string, ptype PatternType, setters ...Option...
  function wildmatchToString (line 102) | func wildmatchToString(ps ...Pattern) []string {
  type wm (line 170) | type wm struct
    method Match (line 175) | func (w *wm) Match(filename string) bool {
    method String (line 179) | func (w *wm) String() string {
  constant sep (line 184) | sep byte = '/'
  function NewPattern (line 187) | func NewPattern(p string, ptype PatternType) Pattern {
  function join (line 218) | func join(paths ...string) string {
  function convertToWildmatch (line 231) | func convertToWildmatch(rawpatterns []string, ptype PatternType) []Patte...

FILE: filepathfilter/filepathfilter_test.go
  function TestPatternMatch (line 9) | func TestPatternMatch(t *testing.T) {
  function assertPatternMatch (line 109) | func assertPatternMatch(t *testing.T, pattern string, filenames ...strin...
  function assertPatternMatchIgnore (line 116) | func assertPatternMatchIgnore(t *testing.T, pattern string, filenames .....
  function refutePatternMatch (line 123) | func refutePatternMatch(t *testing.T, pattern string, filenames ...strin...
  function refutePatternMatchIgnore (line 130) | func refutePatternMatchIgnore(t *testing.T, pattern string, filenames .....
  type filterTest (line 137) | type filterTest struct
  function TestFilterReportsIncludePatterns (line 144) | func TestFilterReportsIncludePatterns(t *testing.T) {
  function TestFilterReportsExcludePatterns (line 150) | func TestFilterReportsExcludePatterns(t *testing.T) {

FILE: fs/cleanup.go
  method cleanupTmp (line 14) | func (f *Filesystem) cleanupTmp() error {

FILE: fs/fs.go
  type Environment (line 30) | type Environment interface
  type Object (line 35) | type Object struct
  type Filesystem (line 40) | type Filesystem struct
    method EachObject (line 51) | func (f *Filesystem) EachObject(fn func(Object) error) error {
    method ObjectExists (line 68) | func (f *Filesystem) ObjectExists(oid string, size int64) bool {
    method ObjectPath (line 75) | func (f *Filesystem) ObjectPath(oid string) (string, error) {
    method ObjectPathname (line 89) | func (f *Filesystem) ObjectPathname(oid string) string {
    method DecodePathname (line 96) | func (f *Filesystem) DecodePathname(path string) string {
    method RepositoryPermissions (line 100) | func (f *Filesystem) RepositoryPermissions(executable bool) os.FileMode {
    method localObjectDir (line 139) | func (f *Filesystem) localObjectDir(oid string) string {
    method ObjectReferencePaths (line 143) | func (f *Filesystem) ObjectReferencePaths(oid string) []string {
    method LFSObjectDir (line 155) | func (f *Filesystem) LFSObjectDir() string {
    method LogDir (line 167) | func (f *Filesystem) LogDir() string {
    method TempDir (line 179) | func (f *Filesystem) TempDir() string {
    method Cleanup (line 191) | func (f *Filesystem) Cleanup() error {
  function DecodePathBytes (line 110) | func DecodePathBytes(path []byte) []byte {
  function New (line 202) | func New(env Environment, gitdir, workdir, lfsdir string, repoPerms os.F...
  function resolveReferenceDirs (line 224) | func resolveReferenceDirs(env Environment, gitStorageDir string) []string {
  function existsAlternate (line 271) | func existsAlternate(objs string) (string, bool) {
  function resolveGitStorageDir (line 300) | func resolveGitStorageDir(gitDir string) string {
  function processGitRedirectFile (line 312) | func processGitRedirectFile(file, prefix string) (string, error) {

FILE: fs/fs_test.go
  function TestDecodeNone (line 10) | func TestDecodeNone(t *testing.T) {
  function TestDecodeSingle (line 14) | func TestDecodeSingle(t *testing.T) {
  function TestDecodeMultiple (line 18) | func TestDecodeMultiple(t *testing.T) {
  function evaluate (line 22) | func evaluate(t *testing.T, input string, expected string) {
  function TestRepositoryPermissions (line 33) | func TestRepositoryPermissions(t *testing.T) {

FILE: git-lfs.go
  function main (line 14) | func main() {

FILE: git/config.go
  type Environment (line 21) | type Environment interface
  type Configuration (line 28) | type Configuration struct
    method Find (line 65) | func (c *Configuration) Find(val string) string {
    method FindGlobal (line 71) | func (c *Configuration) FindGlobal(key string) string {
    method FindSystem (line 77) | func (c *Configuration) FindSystem(key string) string {
    method FindLocal (line 83) | func (c *Configuration) FindLocal(key string) string {
    method FindWorktree (line 89) | func (c *Configuration) FindWorktree(key string) string {
    method FindFile (line 95) | func (c *Configuration) FindFile(file, key string) string {
    method SetGlobal (line 101) | func (c *Configuration) SetGlobal(key, val string) (string, error) {
    method SetSystem (line 106) | func (c *Configuration) SetSystem(key, val string) (string, error) {
    method SetLocal (line 111) | func (c *Configuration) SetLocal(key, val string) (string, error) {
    method SetWorktree (line 116) | func (c *Configuration) SetWorktree(key, val string) (string, error) {
    method SetFile (line 121) | func (c *Configuration) SetFile(file, key, val string) (string, error) {
    method UnsetGlobalSection (line 126) | func (c *Configuration) UnsetGlobalSection(key string) (string, error) {
    method UnsetSystemSection (line 131) | func (c *Configuration) UnsetSystemSection(key string) (string, error) {
    method UnsetLocalSection (line 136) | func (c *Configuration) UnsetLocalSection(key string) (string, error) {
    method UnsetWorktreeSection (line 141) | func (c *Configuration) UnsetWorktreeSection(key string) (string, erro...
    method UnsetFileSection (line 146) | func (c *Configuration) UnsetFileSection(file, key string) (string, er...
    method UnsetLocalKey (line 151) | func (c *Configuration) UnsetLocalKey(key string) (string, error) {
    method Sources (line 155) | func (c *Configuration) Sources(dir string, optionalFilename string) (...
    method FileSource (line 188) | func (c *Configuration) FileSource(filename string) (*ConfigurationSou...
    method RevisionSource (line 200) | func (c *Configuration) RevisionSource(revision string) (*Configuratio...
    method Source (line 208) | func (c *Configuration) Source() (*ConfigurationSource, error) {
    method gitConfig (line 216) | func (c *Configuration) gitConfig(args ...string) (string, error) {
    method gitConfigWrite (line 228) | func (c *Configuration) gitConfigWrite(args ...string) (string, error) {
  function NewConfig (line 36) | func NewConfig(workdir, gitdir string) *Configuration {
  function NewReadOnlyConfig (line 45) | func NewReadOnlyConfig(workdir, gitdir string) *Configuration {
  function ParseConfigLines (line 52) | func ParseConfigLines(lines string, onlySafeKeys bool) *ConfigurationSou...
  type ConfigurationSource (line 59) | type ConfigurationSource struct

FILE: git/config_test.go
  function TestReadOnlyConfig (line 10) | func TestReadOnlyConfig(t *testing.T) {

FILE: git/filter_process_scanner.go
  type FilterProcessScanner (line 31) | type FilterProcessScanner struct
    method Init (line 71) | func (o *FilterProcessScanner) Init() error {
    method NegotiateCapabilities (line 103) | func (o *FilterProcessScanner) NegotiateCapabilities() ([]string, erro...
    method Scan (line 147) | func (o *FilterProcessScanner) Scan() bool {
    method Request (line 163) | func (o *FilterProcessScanner) Request() *Request { return o.req }
    method Err (line 168) | func (o *FilterProcessScanner) Err() error { return o.err }
    method readRequest (line 173) | func (o *FilterProcessScanner) readRequest() (*Request, error) {
    method WriteList (line 196) | func (o *FilterProcessScanner) WriteList(list []string) error {
    method WriteStatus (line 200) | func (o *FilterProcessScanner) WriteStatus(status FilterProcessStatus)...
  function NewFilterProcessScanner (line 54) | func NewFilterProcessScanner(r io.Reader, w io.Writer) *FilterProcessSca...
  type Request (line 130) | type Request struct

FILE: git/filter_process_scanner_test.go
  function TestFilterProcessScannerInitializesWithCorrectSupportedValues (line 13) | func TestFilterProcessScannerInitializesWithCorrectSupportedValues(t *te...
  function TestFilterProcessScannerRejectsUnrecognizedInitializationMessages (line 34) | func TestFilterProcessScannerRejectsUnrecognizedInitializationMessages(t...
  function TestFilterProcessScannerRejectsUnsupportedFilters (line 49) | func TestFilterProcessScannerRejectsUnsupportedFilters(t *testing.T) {
  function TestFilterProcessScannerNegotitatesSupportedCapabilities (line 65) | func TestFilterProcessScannerNegotitatesSupportedCapabilities(t *testing...
  function TestFilterProcessScannerDoesNotNegotitatesUnsupportedCapabilities (line 85) | func TestFilterProcessScannerDoesNotNegotitatesUnsupportedCapabilities(t...
  function TestFilterProcessScannerReadsRequestHeadersAndPayload (line 103) | func TestFilterProcessScannerReadsRequestHeadersAndPayload(t *testing.T) {
  function TestFilterProcessScannerRejectsInvalidHeaderPackets (line 128) | func TestFilterProcessScannerRejectsInvalidHeaderPackets(t *testing.T) {
  function TestFilterProcessScannerWritesLists (line 141) | func TestFilterProcessScannerWritesLists(t *testing.T) {
  function readRequest (line 154) | func readRequest(s *FilterProcessScanner) (*Request, error) {

FILE: git/filter_process_status.go
  type FilterProcessStatus (line 7) | type FilterProcessStatus
    method String (line 22) | func (s FilterProcessStatus) String() string {
  constant StatusSuccess (line 12) | StatusSuccess FilterProcessStatus = iota + 1
  constant StatusDelay (line 14) | StatusDelay
  constant StatusError (line 16) | StatusError

FILE: git/git.go
  type RefType (line 32) | type RefType
    method Prefix (line 69) | func (t RefType) Prefix() (string, bool) {
  constant RefTypeLocalBranch (line 35) | RefTypeLocalBranch  = RefType(iota)
  constant RefTypeRemoteBranch (line 36) | RefTypeRemoteBranch = RefType(iota)
  constant RefTypeLocalTag (line 37) | RefTypeLocalTag     = RefType(iota)
  constant RefTypeRemoteTag (line 38) | RefTypeRemoteTag    = RefType(iota)
  constant RefTypeHEAD (line 39) | RefTypeHEAD         = RefType(iota)
  constant RefTypeOther (line 40) | RefTypeOther        = RefType(iota)
  constant SHA1HexSize (line 42) | SHA1HexSize   = sha1.Size * 2
  constant SHA256HexSize (line 43) | SHA256HexSize = sha256.Size * 2
  type IndexStage (line 55) | type IndexStage
  constant IndexStageDefault (line 58) | IndexStageDefault IndexStage = iota
  constant IndexStageBase (line 59) | IndexStageBase
  constant IndexStageOurs (line 60) | IndexStageOurs
  constant IndexStageTheirs (line 61) | IndexStageTheirs
  function ParseRef (line 82) | func ParseRef(absRef, sha string) *Ref {
  type Ref (line 105) | type Ref struct
    method Refspec (line 116) | func (r *Ref) Refspec() string {
  function HasValidObjectIDLength (line 131) | func HasValidObjectIDLength(s string) bool {
  function IsZeroObjectID (line 137) | func IsZeroObjectID(s string) bool {
  function EmptyTree (line 146) | func EmptyTree() (string, error) {
  type CommitSummary (line 163) | type CommitSummary struct
  function gitConfigNoLFS (line 177) | func gitConfigNoLFS(args ...string) []string {
  function gitNoLFS (line 199) | func gitNoLFS(args ...string) (*subprocess.Cmd, error) {
  function gitNoLFSSimple (line 203) | func gitNoLFSSimple(args ...string) (string, error) {
  function gitNoLFSBuffered (line 207) | func gitNoLFSBuffered(args ...string) (*subprocess.BufferedCmd, error) {
  function gitNoLFSBufferedStdout (line 211) | func gitNoLFSBufferedStdout(args ...string) (*subprocess.BufferedCmd, er...
  function git (line 216) | func git(args ...string) (*subprocess.Cmd, error) {
  function gitSimple (line 220) | func gitSimple(args ...string) (string, error) {
  function gitBuffered (line 224) | func gitBuffered(args ...string) (*subprocess.BufferedCmd, error) {
  function gitBufferedStdout (line 228) | func gitBufferedStdout(args ...string) (*subprocess.BufferedCmd, error) {
  function CatFile (line 232) | func CatFile() (*subprocess.BufferedCmd, error) {
  function Var (line 236) | func Var(name string) (*subprocess.Cmd, error) {
  function DiffIndex (line 240) | func DiffIndex(ref string, cached bool, refresh bool, workingDir string)...
  function DiffIndexWithPaths (line 269) | func DiffIndexWithPaths(ref string, cached bool, paths []string) (string...
  function HashObject (line 286) | func HashObject(r io.Reader) (string, error) {
  function Log (line 300) | func Log(args ...string) (*subprocess.BufferedCmd, error) {
  function LsRemote (line 305) | func LsRemote(remote, remoteRef string) (string, error) {
  function LsTree (line 316) | func LsTree(ref string) (*subprocess.BufferedCmd, error) {
  function LsFilesLFS (line 327) | func LsFilesLFS() (*subprocess.BufferedCmd, error) {
  function ResolveRef (line 341) | func ResolveRef(ref string) (*Ref, error) {
  function ResolveRefs (line 366) | func ResolveRefs(refnames []string) ([]*Ref, error) {
  function CurrentRef (line 379) | func CurrentRef() (*Ref, error) {
  method CurrentRemoteRef (line 383) | func (c *Configuration) CurrentRemoteRef() (*Ref, error) {
  method RemoteRefNameForCurrentBranch (line 394) | func (c *Configuration) RemoteRefNameForCurrentBranch() (string, error) {
  method RemoteForBranch (line 415) | func (c *Configuration) RemoteForBranch(localBranch string) string {
  method RemoteBranchForLocalBranch (line 421) | func (c *Configuration) RemoteBranchForLocalBranch(localBranch string) s...
  function RemoteList (line 431) | func RemoteList() ([]string, error) {
  function RemoteURLs (line 454) | func RemoteURLs(push bool) (map[string][]string, error) {
  function MapRemoteURL (line 491) | func MapRemoteURL(url string, push bool) (string, bool) {
  function LocalRefs (line 507) | func LocalRefs() ([]*Ref, error) {
  function UpdateRef (line 547) | func UpdateRef(ref *Ref, to []byte, reason string) error {
  function UpdateRefsFromStdin (line 561) | func UpdateRefsFromStdin(wd string) (*subprocess.Cmd, error) {
  function ValidateRemote (line 569) | func ValidateRemote(remote string) error {
  function ValidateRemoteFromList (line 580) | func ValidateRemoteFromList(remotes []string, remote string) error {
  function ValidateRemoteURL (line 593) | func ValidateRemoteURL(remote string) error {
  function RewriteLocalPathAsURL (line 616) | func RewriteLocalPathAsURL(path string) string {
  function UpdateIndexFromStdin (line 644) | func UpdateIndexFromStdin() (*subprocess.Cmd, error) {
  function RecentBranches (line 653) | func RecentBranches(since time.Time, includeRemoteBranches bool, onlyRem...
  function ParseRefToTypeAndName (line 712) | func ParseRefToTypeAndName(fullref string) (t RefType, name string) {
  function ParseGitDate (line 737) | func ParseGitDate(str string) (time.Time, error) {
  function FormatGitDate (line 749) | func FormatGitDate(tm time.Time) string {
  function GetCommitSummary (line 755) | func GetCommitSummary(commit string) (*CommitSummary, error) {
  function GitAndRootDirs (line 793) | func GitAndRootDirs() (string, string, error) {
  function RootDir (line 834) | func RootDir() (string, error) {
  function GitDir (line 857) | func GitDir() (string, error) {
  function GitCommonDir (line 877) | func GitCommonDir() (string, error) {
  type Worktree (line 904) | type Worktree struct
  function GetAllWorktrees (line 916) | func GetAllWorktrees(storageDir string) ([]*Worktree, error) {
  function getAllWorktreesFromGitDir (line 1010) | func getAllWorktreesFromGitDir(storageDir string) ([]*Worktree, error) {
  function parseRefFile (line 1089) | func parseRefFile(filename string) (*Ref, error) {
  function parseDirFile (line 1101) | func parseDirFile(filename string) (string, error) {
  function IsBare (line 1115) | func IsBare() (bool, error) {
  type CloneFlags (line 1127) | type CloneFlags struct
  function CloneWithoutFilters (line 1192) | func CloneWithoutFilters(flags CloneFlags, args []string) error {
  function Checkout (line 1318) | func Checkout(treeish string, paths []string, force bool) error {
  function CachedRemoteRefs (line 1338) | func CachedRemoteRefs(remoteName string) ([]*Ref, error) {
  function parseShowRefLine (line 1365) | func parseShowRefLine(refPrefix, line string) (sha, name string, ok bool) {
  function Fetch (line 1378) | func Fetch(remotes ...string) error {
  function RemoteRefs (line 1395) | func RemoteRefs(remoteName string, withTags bool) ([]*Ref, error) {
  function parseLsRemoteLine (line 1435) | func parseLsRemoteLine(line string) (sha, ns, name string, ok bool) {
  function AllRefs (line 1459) | func AllRefs() ([]*Ref, error) {
  function AllRefsIn (line 1466) | func AllRefsIn(wd string) ([]*Ref, error) {
  function GetTrackedFiles (line 1511) | func GetTrackedFiles(pattern string) ([]string, error) {
  function sanitizePattern (line 1551) | func sanitizePattern(pattern string) string {
  function GetFilesChanged (line 1562) | func GetFilesChanged(from, to string) ([]string, error) {
  function IsFileModified (line 1605) | func IsFileModified(filepath string) (bool, error) {
  function IsWorkingCopyDirty (line 1651) | func IsWorkingCopyDirty() (bool, error) {
  function ObjectDatabase (line 1664) | func ObjectDatabase(osEnv, gitEnv Environment, gitdir, tempdir string) (...
  function remotesForTreeish (line 1688) | func remotesForTreeish(treeish string) []string {
  function remoteForRef (line 1716) | func remoteForRef(refname string) string {
  function getValidRemote (line 1737) | func getValidRemote(refs []string) string {
  function FirstRemoteForTreeish (line 1747) | func FirstRemoteForTreeish(treeish string) string {

FILE: git/git_test.go
  function TestRefString (line 16) | func TestRefString(t *testing.T) {
  function TestParseRefs (line 49) | func TestParseRefs(t *testing.T) {
  function TestCurrentRefAndCurrentRemoteRef (line 74) | func TestCurrentRefAndCurrentRemoteRef(t *testing.T) {
  function TestRecentBranches (line 153) | func TestRecentBranches(t *testing.T) {
  function TestResolveEmptyCurrentRef (line 323) | func TestResolveEmptyCurrentRef(t *testing.T) {
  function TestWorktrees (line 335) | func TestWorktrees(t *testing.T) {
  function TestWorktreesBareRepo (line 461) | func TestWorktreesBareRepo(t *testing.T) {
  function TestVersionCompare (line 479) | func TestVersionCompare(t *testing.T) {
  function TestGitAndRootDirs (line 492) | func TestGitAndRootDirs(t *testing.T) {
  function TestGetTrackedFiles (line 518) | func TestGetTrackedFiles(t *testing.T) {
  function TestLocalRefs (line 620) | func TestLocalRefs(t *testing.T) {
  function TestGetFilesChanges (line 678) | func TestGetFilesChanges(t *testing.T) {
  function TestValidateRemoteURL (line 744) | func TestValidateRemoteURL(t *testing.T) {
  function TestRefTypeKnownPrefixes (line 755) | func TestRefTypeKnownPrefixes(t *testing.T) {
  function TestRemoteURLs (line 773) | func TestRemoteURLs(t *testing.T) {
  function TestMapRemoteURL (line 798) | func TestMapRemoteURL(t *testing.T) {
  function TestIsValidObjectIDLength (line 860) | func TestIsValidObjectIDLength(t *testing.T) {
  function TestIsZeroObjectID (line 868) | func TestIsZeroObjectID(t *testing.T) {

FILE: git/gitattr/attr.go
  constant attrPrefix (line 15) | attrPrefix = "[attr]"
  type Line (line 17) | type Line interface
  type PatternLine (line 21) | type PatternLine interface
  type MacroLine (line 26) | type MacroLine interface
  type lineAttrs (line 31) | type lineAttrs struct
    method Attrs (line 39) | func (l *lineAttrs) Attrs() []*Attr {
  type patternLine (line 43) | type patternLine struct
    method Pattern (line 57) | func (pl *patternLine) Pattern() *wildmatch.Wildmatch {
  type macroLine (line 61) | type macroLine struct
    method Macro (line 71) | func (ml *macroLine) Macro() string {
  type Attr (line 76) | type Attr struct
  function ParseLines (line 96) | func ParseLines(r io.Reader) ([]Line, string, error) {
  type lineEndingSplitter (line 187) | type lineEndingSplitter struct
    method LineEnding (line 192) | func (s *lineEndingSplitter) LineEnding() string {
    method ScanLines (line 201) | func (s *lineEndingSplitter) ScanLines(data []byte, atEOF bool) (advan...
    method dropCR (line 218) | func (s *lineEndingSplitter) dropCR(data []byte) []byte {

FILE: git/gitattr/attr_test.go
  function TestParseLines (line 11) | func TestParseLines(t *testing.T) {
  function TestParseLinesManyAttrs (line 25) | func TestParseLinesManyAttrs(t *testing.T) {
  function TestParseLinesManyLines (line 45) | func TestParseLinesManyLines(t *testing.T) {
  function TestParseLinesUnset (line 89) | func TestParseLinesUnset(t *testing.T) {
  function TestParseLinesUnspecified (line 103) | func TestParseLinesUnspecified(t *testing.T) {
  function TestParseLinesQuotedPattern (line 117) | func TestParseLinesQuotedPattern(t *testing.T) {
  function TestParseLinesCommented (line 132) | func TestParseLinesCommented(t *testing.T) {
  function TestParseLinesUnbalancedQuotes (line 140) | func TestParseLinesUnbalancedQuotes(t *testing.T) {
  function TestParseLinesWithNoAttributes (line 149) | func TestParseLinesWithNoAttributes(t *testing.T) {
  function TestParseLinesWithMacros (line 161) | func TestParseLinesWithMacros(t *testing.T) {

FILE: git/gitattr/files.go
  constant LockableAttrib (line 20) | LockableAttrib = "lockable"
  constant FilterAttrib (line 21) | FilterAttrib   = "filter"
  type AttributePath (line 25) | type AttributePath struct
  type AttributeSource (line 36) | type AttributeSource struct
    method String (line 46) | func (s *AttributeSource) String() string {
  type attrFile (line 41) | type attrFile struct
  function GetUserAttributePaths (line 52) | func GetUserAttributePaths(mp *MacroProcessor, gitEnv Environment) ([]At...
  function GetUserAttributeFilePath (line 67) | func GetUserAttributeFilePath(gitEnv Environment) (string, error) {
  function GetRepoAttributeFilePath (line 79) | func GetRepoAttributeFilePath(gitDir string) (string, error) {
  function GetSystemAttributePaths (line 91) | func GetSystemAttributePaths(mp *MacroProcessor, env Environment) ([]Att...
  function GetSystemAttributeFilePath (line 106) | func GetSystemAttributeFilePath(osEnv Environment) (string, error) {
  function GetAttributePaths (line 142) | func GetAttributePaths(mp *MacroProcessor, workingDir, gitDir string) []...
  function attrPathsFromFile (line 152) | func attrPathsFromFile(mp *MacroProcessor, path, workingDir string, read...
  function AttrPathsFromReader (line 161) | func AttrPathsFromReader(mp *MacroProcessor, fpath, workingDir string, r...
  function GetAttributeFilter (line 222) | func GetAttributeFilter(workingDir, gitDir string) *filepathfilter.Filter {
  function findAttributeFiles (line 237) | func findAttributeFiles(workingDir, gitDir string) []attrFile {

FILE: git/gitattr/macro.go
  type MacroProcessor (line 3) | type MacroProcessor struct
    method ProcessLines (line 28) | func (mp *MacroProcessor) ProcessLines(lines []Line, readMacros bool) ...
    method ProcessMacros (line 75) | func (mp *MacroProcessor) ProcessMacros(lines []Line) {
  function NewMacroProcessor (line 9) | func NewMacroProcessor() *MacroProcessor {

FILE: git/gitattr/macro_test.go
  function TestProcessLinesWithMacros (line 10) | func TestProcessLinesWithMacros(t *testing.T) {
  function TestProcessLinesWithMacrosDisabled (line 44) | func TestProcessLinesWithMacrosDisabled(t *testing.T) {
  function TestProcessLinesWithUnspecifiedMacros (line 74) | func TestProcessLinesWithUnspecifiedMacros(t *testing.T) {
  function TestProcessLinesWithBinaryMacros (line 112) | func TestProcessLinesWithBinaryMacros(t *testing.T) {
  function TestProcessLinesIsStateful (line 143) | func TestProcessLinesIsStateful(t *testing.T) {
  function TestProcessLineOverrides (line 187) | func TestProcessLineOverrides(t *testing.T) {

FILE: git/gitattr/tree.go
  type Environment (line 15) | type Environment interface
  type Tree (line 22) | type Tree struct
    method FindSpecialAttributes (line 92) | func (t *Tree) FindSpecialAttributes(gitEnv, osEnv Environment, gitDir...
    method Applied (line 175) | func (t *Tree) Applied(to string) []*Attr {
    method applied (line 208) | func (t *Tree) applied(to string) []*Attr {
  function New (line 39) | func New(db *gitobj.ObjectDatabase, t *gitobj.Tree) (*Tree, error) {
  function newFromGitTree (line 44) | func newFromGitTree(db *gitobj.ObjectDatabase, t *gitobj.Tree, mp *Macro...
  function NewFromReader (line 81) | func NewFromReader(mp *MacroProcessor, rdr io.Reader) (*Tree, error) {
  function linesInTree (line 147) | func linesInTree(db *gitobj.ObjectDatabase, t *gitobj.Tree, mp *MacroPro...

FILE: git/gitattr/tree_test.go
  function TestTreeAppliedInRoot (line 60) | func TestTreeAppliedInRoot(t *testing.T) {
  function TestTreeAppliedInSubtreeRelevant (line 70) | func TestTreeAppliedInSubtreeRelevant(t *testing.T) {
  function TestTreeAppliedInSubtreeIrrelevant (line 81) | func TestTreeAppliedInSubtreeIrrelevant(t *testing.T) {
  function TestTreeAppliedInIrrelevantSubtree (line 87) | func TestTreeAppliedInIrrelevantSubtree(t *testing.T) {
  function TestNewDiscoversSimpleTrees (line 97) | func TestNewDiscoversSimpleTrees(t *testing.T) {
  function TestNewDiscoversSimpleChildrenTrees (line 127) | func TestNewDiscoversSimpleChildrenTrees(t *testing.T) {
  function TestNewDiscoversIndirectChildrenTrees (line 168) | func TestNewDiscoversIndirectChildrenTrees(t *testing.T) {
  function TestNewIgnoresChildrenAppropriately (line 218) | func TestNewIgnoresChildrenAppropriately(t *testing.T) {
  function TestNewDiscoversSimpleTreesMacro (line 256) | func TestNewDiscoversSimpleTreesMacro(t *testing.T) {
  function TestAppliedProcessInCorrectOrder (line 288) | func TestAppliedProcessInCorrectOrder(t *testing.T) {

FILE: git/githistory/fixtures_test.go
  function DatabaseFromFixture (line 22) | func DatabaseFromFixture(t *testing.T, name string) *gitobj.ObjectDataba...
  function AssertBlobContents (line 37) | func AssertBlobContents(t *testing.T, db *gitobj.ObjectDatabase, tree, p...
  function AssertCommitParent (line 101) | func AssertCommitParent(t *testing.T, db *gitobj.ObjectDatabase, sha, pa...
  function AssertCommitTree (line 118) | func AssertCommitTree(t *testing.T, db *gitobj.ObjectDatabase, sha, tree...
  function AssertRef (line 133) | func AssertRef(t *testing.T, db *gitobj.ObjectDatabase, ref string, expe...
  function HexDecode (line 148) | func HexDecode(t *testing.T, sha string) []byte {
  function copyToTmp (line 158) | func copyToTmp(fixture string) (string, error) {
  function copyDir (line 172) | func copyDir(from, to string) error {
  function copyFile (line 206) | func copyFile(from, to string) error {

FILE: git/githistory/ref_updater.go
  type refUpdater (line 19) | type refUpdater struct
    method updateRefs (line 44) | func (r *refUpdater) updateRefs() error {
    method updateOneTag (line 110) | func (r *refUpdater) updateOneTag(tag *gitobj.Tag, toObj []byte) ([]by...
    method updateOneRef (line 126) | func (r *refUpdater) updateOneRef(list *tasklog.ListTask, maxNameLen i...

FILE: git/githistory/ref_updater_test.go
  function TestRefUpdaterMovesRefs (line 10) | func TestRefUpdaterMovesRefs(t *testing.T) {
  function TestRefUpdaterMovesRefsWithAnnotatedTags (line 40) | func TestRefUpdaterMovesRefsWithAnnotatedTags(t *testing.T) {
  function TestRefUpdaterIgnoresUnovedRefs (line 70) | func TestRefUpdaterIgnoresUnovedRefs(t *testing.T) {

FILE: git/githistory/rewriter.go
  type Rewriter (line 21) | type Rewriter struct
    method Rewrite (line 199) | func (r *Rewriter) Rewrite(opt *RewriteOptions) ([]byte, error) {
    method rewriteTree (line 346) | func (r *Rewriter) rewriteTree(commitOID []byte, treeOID []byte, path ...
    method gitDirectory (line 441) | func (r *Rewriter) gitDirectory() (string, bool) {
    method allows (line 449) | func (r *Rewriter) allows(typ gitobj.ObjectType, abs string) bool {
    method rewriteBlob (line 464) | func (r *Rewriter) rewriteBlob(commitOID, from []byte, path string, fn...
    method commitsToMigrate (line 512) | func (r *Rewriter) commitsToMigrate(opt *RewriteOptions) ([][]byte, er...
    method refsToMigrate (line 538) | func (r *Rewriter) refsToMigrate() ([]*git.Ref, error) {
    method scannerOpts (line 569) | func (r *Rewriter) scannerOpts() *git.ScanRefsOptions {
    method Filter (line 589) | func (r *Rewriter) Filter() *filepathfilter.Filter {
    method cacheEntry (line 595) | func (r *Rewriter) cacheEntry(path string, from, to *gitobj.TreeEntry)...
    method uncacheEntry (line 607) | func (r *Rewriter) uncacheEntry(path string, from *gitobj.TreeEntry) *...
    method entryKey (line 615) | func (r *Rewriter) entryKey(path string, e *gitobj.TreeEntry) string {
    method cacheCommit (line 621) | func (r *Rewriter) cacheCommit(from, to []byte) {
    method uncacheCommit (line 632) | func (r *Rewriter) uncacheCommit(from []byte) ([]byte, bool) {
  type RewriteOptions (line 43) | type RewriteOptions struct
    method blobFn (line 83) | func (r *RewriteOptions) blobFn() BlobRewriteFn {
    method treePreFn (line 92) | func (r *RewriteOptions) treePreFn() TreePreCallbackFn {
    method treeFn (line 101) | func (r *RewriteOptions) treeFn() TreeCallbackFn {
  type BlobRewriteFn (line 122) | type BlobRewriteFn
  type TreePreCallbackFn (line 135) | type TreePreCallbackFn
  type TreeCallbackFn (line 147) | type TreeCallbackFn
  type rewriterOption (line 149) | type rewriterOption
  function NewRewriter (line 181) | func NewRewriter(db *gitobj.ObjectDatabase, opts ...rewriterOption) *Rew...
  function copyEntry (line 418) | func copyEntry(e *gitobj.TreeEntry) *gitobj.TreeEntry {
  function copyEntryMode (line 433) | func copyEntryMode(e *gitobj.TreeEntry, mode int32) *gitobj.TreeEntry {

FILE: git/githistory/rewriter_test.go
  function TestRewriterRewritesHistory (line 18) | func TestRewriterRewritesHistory(t *testing.T) {
  function TestRewriterRewritesOctopusMerges (line 79) | func TestRewriterRewritesOctopusMerges(t *testing.T) {
  function TestRewriterVisitsPackedObjects (line 124) | func TestRewriterVisitsPackedObjects(t *testing.T) {
  function TestRewriterDoesntVisitUnchangedSubtrees (line 150) | func TestRewriterDoesntVisitUnchangedSubtrees(t *testing.T) {
  function TestRewriterVisitsUniqueEntriesWithIdenticalContents (line 170) | func TestRewriterVisitsUniqueEntriesWithIdenticalContents(t *testing.T) {
  function TestRewriterIgnoresPathsThatDontMatchFilter (line 203) | func TestRewriterIgnoresPathsThatDontMatchFilter(t *testing.T) {
  function TestRewriterIgnoresPathsThatDontMatchFilterWithResultCaching (line 227) | func TestRewriterIgnoresPathsThatDontMatchFilterWithResultCaching(t *tes...
  function TestRewriterAllowsAdditionalTreeEntries (line 251) | func TestRewriterAllowsAdditionalTreeEntries(t *testing.T) {
  type CallbackCall (line 322) | type CallbackCall struct
  function TestHistoryRewriterCallbacks (line 360) | func TestHistoryRewriterCallbacks(t *testing.T) {
  function TestHistoryRewriterCallbacksSubtrees (line 382) | func TestHistoryRewriterCallbacksSubtrees(t *testing.T) {
  function TestHistoryRewriterTreePreCallbackPropagatesErrors (line 403) | func TestHistoryRewriterTreePreCallbackPropagatesErrors(t *testing.T) {
  function TestHistoryRewriterUseOriginalParentsForPartialMigration (line 422) | func TestHistoryRewriterUseOriginalParentsForPartialMigration(t *testing...
  function TestHistoryRewriterUpdatesRefs (line 455) | func TestHistoryRewriterUpdatesRefs(t *testing.T) {
  function TestHistoryRewriterReturnsFilter (line 489) | func TestHistoryRewriterReturnsFilter(t *testing.T) {
  function debug (line 505) | func debug(t *testing.T, db *gitobj.ObjectDatabase, tip []byte, err erro...

FILE: git/ls_files.go
  type lsFileInfo (line 15) | type lsFileInfo struct
  type LsFiles (line 19) | type LsFiles struct
  function NewLsFiles (line 24) | func NewLsFiles(workingDir string, standardExclude bool, untracked bool)...

FILE: git/ls_tree_scanner.go
  type TreeBlob (line 12) | type TreeBlob struct
  type LsTreeScanner (line 19) | type LsTreeScanner struct
    method TreeBlob (line 30) | func (s *LsTreeScanner) TreeBlob() *TreeBlob {
    method Err (line 34) | func (s *LsTreeScanner) Err() error {
    method Scan (line 38) | func (s *LsTreeScanner) Scan() bool {
    method next (line 44) | func (s *LsTreeScanner) next() (*TreeBlob, bool) {
  function NewLsTreeScanner (line 24) | func NewLsTreeScanner(r io.Reader) *LsTreeScanner {
  function scanNullLines (line 76) | func scanNullLines(data []byte, atEOF bool) (advance int, token []byte, ...

FILE: git/ls_tree_scanner_test.go
  type genericScanner (line 10) | type genericScanner interface
  function assertNextScan (line 15) | func assertNextScan(t *testing.T, scanner genericScanner) {
  function assertScannerDone (line 20) | func assertScannerDone(t *testing.T, scanner genericScanner) {
  function TestLsTreeParser (line 25) | func TestLsTreeParser(t *testing.T) {
  function assertNextTreeBlob (line 34) | func assertNextTreeBlob(t *testing.T, scanner *LsTreeScanner, oid, filen...
  function BenchmarkLsTreeParser (line 42) | func BenchmarkLsTreeParser(b *testing.B) {

FILE: git/object_scanner.go
  type object (line 13) | type object struct
  type ObjectScanner (line 28) | type ObjectScanner struct
    method Scan (line 71) | func (s *ObjectScanner) Scan(oid string) bool {
    method Close (line 92) | func (s *ObjectScanner) Close() error {
    method Contents (line 105) | func (s *ObjectScanner) Contents() io.Reader {
    method Sha1 (line 110) | func (s *ObjectScanner) Sha1() string {
    method Size (line 115) | func (s *ObjectScanner) Size() int64 {
    method Type (line 120) | func (s *ObjectScanner) Type() string {
    method Err (line 126) | func (s *ObjectScanner) Err() error { return s.err }
    method reset (line 128) | func (s *ObjectScanner) reset() error {
    method scan (line 161) | func (s *ObjectScanner) scan(oid string) (*object, error) {
  function NewObjectScanner (line 44) | func NewObjectScanner(gitEnv, osEnv Environment) (*ObjectScanner, error) {
  function NewObjectScannerFrom (line 61) | func NewObjectScannerFrom(db *gitobj.ObjectDatabase) *ObjectScanner {
  type missingErr (line 143) | type missingErr struct
    method Error (line 147) | func (m *missingErr) Error() string {
  function IsMissingObject (line 151) | func IsMissingObject(err error) bool {
  function mustDecode (line 156) | func mustDecode(oid string) []byte {

FILE: git/refs.go
  type RefUpdate (line 9) | type RefUpdate struct
    method LocalRef (line 25) | func (u *RefUpdate) LocalRef() *Ref {
    method LocalRefCommitish (line 29) | func (u *RefUpdate) LocalRefCommitish() string {
    method RemoteRef (line 33) | func (u *RefUpdate) RemoteRef() *Ref {
    method RemoteRefCommitish (line 80) | func (u *RefUpdate) RemoteRefCommitish() string {
  function NewRefUpdate (line 16) | func NewRefUpdate(g Env, remote string, localRef, remoteRef *Ref) *RefUp...
  function defaultRemoteRef (line 44) | func defaultRemoteRef(g Env, remote string, localRef *Ref) *Ref {
  function trackingRef (line 73) | func trackingRef(g Env, localRef *Ref) *Ref {
  function refCommitish (line 84) | func refCommitish(r *Ref) string {
  type Env (line 92) | type Env interface

FILE: git/refs_test.go
  function TestRefUpdateDefault (line 9) | func TestRefUpdateDefault(t *testing.T) {
  function TestRefUpdateTrackedDefault (line 24) | func TestRefUpdateTrackedDefault(t *testing.T) {
  function TestRefUpdateCurrentDefault (line 39) | func TestRefUpdateCurrentDefault(t *testing.T) {
  function TestRefUpdateExplicitLocalAndRemoteRefs (line 51) | func TestRefUpdateExplicitLocalAndRemoteRefs(t *testing.T) {
  function newEnv (line 69) | func newEnv(m map[string][]string) *mapEnv {
  type mapEnv (line 73) | type mapEnv struct
    method Get (line 77) | func (m *mapEnv) Get(key string) (string, bool) {

FILE: git/rev_list_scanner.go
  type ScanningMode (line 19) | type ScanningMode
  constant ScanRefsMode (line 23) | ScanRefsMode ScanningMode = iota
  constant ScanAllMode (line 25) | ScanAllMode
  constant ScanRangeToRemoteMode (line 28) | ScanRangeToRemoteMode
  type RevListOrder (line 33) | type RevListOrder
    method Flag (line 57) | func (o RevListOrder) Flag() (string, bool) {
  constant DefaultRevListOrder (line 39) | DefaultRevListOrder RevListOrder = iota
  constant DateRevListOrder (line 42) | DateRevListOrder
  constant AuthorDateRevListOrder (line 45) | AuthorDateRevListOrder
  constant TopoRevListOrder (line 48) | TopoRevListOrder
  type ScanRefsOptions (line 75) | type ScanRefsOptions struct
    method GetName (line 115) | func (o *ScanRefsOptions) GetName(sha string) (string, bool) {
    method SetName (line 126) | func (o *ScanRefsOptions) SetName(sha, name string) {
  type RevListScanner (line 135) | type RevListScanner struct
    method Name (line 304) | func (s *RevListScanner) Name() string { return s.name }
    method OID (line 310) | func (s *RevListScanner) OID() []byte { return s.oid }
    method Err (line 315) | func (s *RevListScanner) Err() error { return s.err }
    method Scan (line 319) | func (s *RevListScanner) Scan() bool {
    method Close (line 334) | func (s *RevListScanner) Close() error {
    method scan (line 343) | func (s *RevListScanner) scan() ([]byte, string, error) {
  function NewRevListScanner (line 165) | func NewRevListScanner(include, excluded []string, opt *ScanRefsOptions)...
  function revListArgs (line 225) | func revListArgs(include, exclude []string, opt *ScanRefsOptions) (io.Re...
  function includeExcludeShas (line 269) | func includeExcludeShas(include, exclude []string) []string {
  function nonZeroShas (line 286) | func nonZeroShas(all []string) []string {

FILE: git/rev_list_scanner_test.go
  type ArgsTestCase (line 16) | type ArgsTestCase struct
    method Assert (line 26) | func (c *ArgsTestCase) Assert(t *testing.T) {
  function TestRevListArgs (line 52) | func TestRevListArgs(t *testing.T) {
  function TestRevListScannerCallsClose (line 161) | func TestRevListScannerCallsClose(t *testing.T) {
  function TestRevListScannerTreatsCloseFnAsOptional (line 178) | func TestRevListScannerTreatsCloseFnAsOptional(t *testing.T) {
  function TestRevListScannerParsesLinesWithNames (line 188) | func TestRevListScannerParsesLinesWithNames(t *testing.T) {
  function TestRevListScannerParsesLinesWithoutName (line 205) | func TestRevListScannerParsesLinesWithoutName(t *testing.T) {

FILE: git/version.go
  function Version (line 18) | func Version() (string, error) {
  function IsGitVersionAtLeast (line 28) | func IsGitVersionAtLeast(ver string) bool {
  function IsVersionAtLeast (line 38) | func IsVersionAtLeast(actualVersion, desiredVersion string) bool {

FILE: lfs/attribute.go
  type Attribute (line 14) | type Attribute struct
    method Install (line 123) | func (a *Attribute) Install(opt *FilterOptions) error {
    method normalizeKey (line 141) | func (a *Attribute) normalizeKey(relative string) string {
    method set (line 149) | func (a *Attribute) set(gitConfig *git.Configuration, key, value strin...
    method Uninstall (line 186) | func (a *Attribute) Uninstall(opt *FilterOptions) error {
  type FilterOptions (line 32) | type FilterOptions struct
    method Install (line 42) | func (o *FilterOptions) Install() error {
    method Uninstall (line 49) | func (o *FilterOptions) Uninstall() error {
  function filterAttribute (line 63) | func filterAttribute() *Attribute {
  function skipSmudgeFilterAttribute (line 90) | func skipSmudgeFilterAttribute() *Attribute {
  function shouldReset (line 205) | func shouldReset(value string, upgradeables []string) bool {

FILE: lfs/config.go
  type FetchPruneConfig (line 6) | type FetchPruneConfig struct
  function NewFetchPruneConfig (line 32) | func NewFetchPruneConfig(git config.Environment) FetchPruneConfig {

FILE: lfs/config_test.go
  function TestFetchPruneConfigDefault (line 10) | func TestFetchPruneConfigDefault(t *testing.T) {
  function TestFetchPruneConfigCustom (line 24) | func TestFetchPruneConfigCustom(t *testing.T) {

FILE: lfs/diff_index_scanner.go
  type DiffIndexStatus (line 19) | type DiffIndexStatus
    method String (line 34) | func (s DiffIndexStatus) String() string {
    method Format (line 64) | func (s DiffIndexStatus) Format(state fmt.State, c rune) {
  constant StatusAddition (line 22) | StatusAddition     DiffIndexStatus = 'A'
  constant StatusCopy (line 23) | StatusCopy         DiffIndexStatus = 'C'
  constant StatusDeletion (line 24) | StatusDeletion     DiffIndexStatus = 'D'
  constant StatusModification (line 25) | StatusModification DiffIndexStatus = 'M'
  constant StatusRename (line 26) | StatusRename       DiffIndexStatus = 'R'
  constant StatusTypeChange (line 27) | StatusTypeChange   DiffIndexStatus = 'T'
  constant StatusUnmerged (line 28) | StatusUnmerged     DiffIndexStatus = 'U'
  constant StatusUnknown (line 29) | StatusUnknown      DiffIndexStatus = 'X'
  type DiffIndexEntry (line 79) | type DiffIndexEntry struct
  type DiffIndexScanner (line 104) | type DiffIndexScanner struct
    method Scan (line 148) | func (s *DiffIndexScanner) Scan() bool {
    method Entry (line 162) | func (s *DiffIndexScanner) Entry() *DiffIndexEntry { return s.next }
    method Err (line 165) | func (s *DiffIndexScanner) Err() error { return s.err }
    method prepareScan (line 169) | func (s *DiffIndexScanner) prepareScan() bool {
    method scan (line 181) | func (s *DiffIndexScanner) scan(line string) (*DiffIndexEntry, error) {
  function NewDiffIndexScanner (line 135) | func NewDiffIndexScanner(ref string, cached bool, refresh bool, workingD...

FILE: lfs/extension.go
  type pipeRequest (line 18) | type pipeRequest struct
  type pipeResponse (line 25) | type pipeResponse struct
  type pipeExtResult (line 30) | type pipeExtResult struct
  type extCommand (line 36) | type extCommand struct
  function pipeExtensions (line 44) | func pipeExtensions(cfg *config.Configuration, request *pipeRequest) (re...

FILE: lfs/gitfilter.go
  type GitFilter (line 11) | type GitFilter struct
    method ObjectPath (line 22) | func (f *GitFilter) ObjectPath(oid string) (string, error) {
    method RemoteRef (line 26) | func (f *GitFilter) RemoteRef() *git.Ref {
  function NewGitFilter (line 18) | func NewGitFilter(cfg *config.Configuration) *GitFilter {

FILE: lfs/gitfilter_clean.go
  type cleanedAsset (line 14) | type cleanedAsset struct
    method Teardown (line 105) | func (a *cleanedAsset) Teardown() error {
  method Clean (line 19) | func (f *GitFilter) Clean(reader io.Reader, fileName string, fileSize in...
  method copyToTemp (line 62) | func (f *GitFilter) copyToTemp(reader io.Reader, fileSize int64, cb tool...

FILE: lfs/gitfilter_smudge.go
  method SmudgeToFile (line 18) | func (f *GitFilter) SmudgeToFile(path string, ptr *WrappedPointer, downl...
  method Smudge (line 54) | func (f *GitFilter) Smudge(writer io.Writer, ptr *Pointer, workingfile s...
  method downloadFile (line 101) | func (f *GitFilter) downloadFile(writer io.Writer, ptr *Pointer, working...
  method downloadFileFallBack (line 125) | func (f *GitFilter) downloadFileFallBack(writer io.Writer, ptr *Pointer,...
  method readLocalFile (line 158) | func (f *GitFilter) readLocalFile(writer io.Writer, ptr *Pointer, mediaf...

FILE: lfs/gitscanner.go
  function IsCallbackMissing (line 17) | func IsCallbackMissing(err error) bool {
  type GitScanner (line 22) | type GitScanner struct
    method ScanMultiRangeToRemote (line 77) | func (s *GitScanner) ScanMultiRangeToRemote(include string, exclude []...
    method ScanRefs (line 99) | func (s *GitScanner) ScanRefs(include, exclude []string, cb GitScanner...
    method ScanRefRange (line 115) | func (s *GitScanner) ScanRefRange(include, exclude string, cb GitScann...
    method ScanRefRangeByTree (line 132) | func (s *GitScanner) ScanRefRangeByTree(include, exclude string, cb Gi...
    method ScanRefWithDeleted (line 149) | func (s *GitScanner) ScanRefWithDeleted(ref string, cb GitScannerFound...
    method ScanRef (line 155) | func (s *GitScanner) ScanRef(ref string, cb GitScannerFoundPointer) er...
    method ScanRefByTree (line 173) | func (s *GitScanner) ScanRefByTree(ref string, cb GitScannerFoundPoint...
    method ScanAll (line 191) | func (s *GitScanner) ScanAll(cb GitScannerFoundPointer) error {
    method ScanTree (line 209) | func (s *GitScanner) ScanTree(ref string, cb GitScannerFoundPointer) e...
    method ScanLFSFiles (line 225) | func (s *GitScanner) ScanLFSFiles(ref string, cb GitScannerFoundPointe...
    method ScanUnpushed (line 240) | func (s *GitScanner) ScanUnpushed(remote string, cb GitScannerFoundPoi...
    method ScanStashed (line 254) | func (s *GitScanner) ScanStashed(cb GitScannerFoundPointer) error {
    method ScanPreviousVersions (line 271) | func (s *GitScanner) ScanPreviousVersions(ref string, since time.Time,...
    method ScanIndex (line 285) | func (s *GitScanner) ScanIndex(ref string, workingDir string, cb GitSc...
  type GitScannerFoundPointer (line 38) | type GitScannerFoundPointer
  type GitScannerFoundLockable (line 39) | type GitScannerFoundLockable
  type GitScannerSet (line 41) | type GitScannerSet interface
  type ScanningMode (line 45) | type ScanningMode
  constant ScanRefsMode (line 48) | ScanRefsMode          = ScanningMode(iota)
  constant ScanAllMode (line 49) | ScanAllMode           = ScanningMode(iota)
  constant ScanRangeToRemoteMode (line 50) | ScanRangeToRemoteMode = ScanningMode(iota)
  function NewGitScanner (line 55) | func NewGitScanner(cfg *config.Configuration, cb GitScannerFoundPointer)...
  function NewGitScannerForPush (line 64) | func NewGitScannerForPush(cfg *config.Configuration, remote string, cb G...
  function firstGitScannerCallback (line 298) | func firstGitScannerCallback(callbacks ...GitScannerFoundPointer) (GitSc...

FILE: lfs/gitscanner_catfilebatch.go
  function runCatFileBatch (line 25) | func runCatFileBatch(pointerCh chan *WrappedPointer, lockableCh chan str...
  type PointerScanner (line 69) | type PointerScanner struct
    method BlobSHA (line 87) | func (s *PointerScanner) BlobSHA() string {
    method ContentsSha (line 91) | func (s *PointerScanner) ContentsSha() string {
    method Pointer (line 95) | func (s *PointerScanner) Pointer() *WrappedPointer {
    method Err (line 99) | func (s *PointerScanner) Err() error {
    method Scan (line 103) | func (s *PointerScanner) Scan(sha string) bool {
    method Close (line 122) | func (s *PointerScanner) Close() error {
    method next (line 126) | func (s *PointerScanner) next(blob string) (string, string, *WrappedPo...
  function NewPointerScanner (line 78) | func NewPointerScanner(gitEnv, osEnv config.Environment) (*PointerScanne...

FILE: lfs/gitscanner_catfilebatchcheck.go
  function runCatFileBatchCheck (line 19) | func runCatFileBatchCheck(smallRevCh chan string, lockableCh chan string...
  type catFileBatchCheckScanner (line 63) | type catFileBatchCheckScanner struct
    method LFSBlobOID (line 70) | func (s *catFileBatchCheckScanner) LFSBlobOID() string {
    method GitBlobOID (line 74) | func (s *catFileBatchCheckScanner) GitBlobOID() string {
    method Err (line 78) | func (s *catFileBatchCheckScanner) Err() error {
    method Scan (line 82) | func (s *catFileBatchCheckScanner) Scan() bool {
    method next (line 89) | func (s *catFileBatchCheckScanner) next() (string, string, bool) {

FILE: lfs/gitscanner_catfilebatchcheckscanner_test.go
  function TestCatFileBatchCheckScannerWithValidOutput (line 11) | func TestCatFileBatchCheckScannerWithValidOutput(t *testing.T) {
  type stringScanner (line 37) | type stringScanner interface
  type genericScanner (line 43) | type genericScanner interface
  function assertNextScan (line 48) | func assertNextScan(t *testing.T, scanner genericScanner) {
  function assertNextOID (line 53) | func assertNextOID(t *testing.T, scanner *catFileBatchCheckScanner, lfsB...
  function assertScannerDone (line 59) | func assertScannerDone(t *testing.T, scanner genericScanner) {

FILE: lfs/gitscanner_index.go
  function scanIndex (line 16) | func scanIndex(cb GitScannerFoundPointer, ref string, workingDir string,...
  function revListIndex (line 112) | func revListIndex(atRef string, cache bool, indexMap *indexFileMap, work...
  type indexFile (line 151) | type indexFile struct
  type indexFileMap (line 157) | type indexFileMap struct
    method FilesFor (line 167) | func (m *indexFileMap) FilesFor(sha string) []*indexFile {
    method Add (line 177) | func (m *indexFileMap) Add(sha string, index *indexFile) {

FILE: lfs/gitscanner_log.go
  type LogDiffDirection (line 24) | type LogDiffDirection
  constant LogDiffAdditions (line 27) | LogDiffAdditions = LogDiffDirection('+')
  constant LogDiffDeletions (line 28) | LogDiffDeletions = LogDiffDirection('-')
  type gitscannerResult (line 45) | type gitscannerResult struct
  function scanUnpushed (line 50) | func scanUnpushed(cb GitScannerFoundPointer, remote string) error {
  function scanStashed (line 73) | func scanStashed(cb GitScannerFoundPointer) error {
  function parseScannerLogOutput (line 137) | func parseScannerLogOutput(cb GitScannerFoundPointer, direction LogDiffD...
  function logPreviousSHAs (line 176) | func logPreviousSHAs(cb GitScannerFoundPointer, ref string, filter *file...
  type logScanner (line 196) | type logScanner struct
    method Pointer (line 234) | func (s *logScanner) Pointer() *WrappedPointer {
    method Err (line 238) | func (s *logScanner) Err() error {
    method Scan (line 242) | func (s *logScanner) Scan() bool {
    method finishLastPointer (line 250) | func (s *logScanner) finishLastPointer() *WrappedPointer {
    method scan (line 282) | func (s *logScanner) scan() (*WrappedPointer, bool) {
    method setFilename (line 352) | func (s *logScanner) setFilename(name string) {
  function newLogScanner (line 218) | func newLogScanner(dir LogDiffDirection, r io.Reader) *logScanner {

FILE: lfs/gitscanner_pointerscanner_test.go
  function TestPointerScannerWithValidOutput (line 18) | func TestPointerScannerWithValidOutput(t *testing.T) {
  function TestPointerScannerWithLargeBlobs (line 65) | func TestPointerScannerWithLargeBlobs(t *testing.T) {
  function assertNextPointer (line 88) | func assertNextPointer(t *testing.T, scanner *PointerScanner, sha string...
  function assertNextEmptyPointer (line 98) | func assertNextEmptyPointer(t *testing.T, scanner *PointerScanner, sha s...
  function fakeObjectsWithRandoData (line 105) | func fakeObjectsWithRandoData(t *testing.T, db *gitobj.ObjectDatabase, b...
  function writeFakeBuffer (line 134) | func writeFakeBuffer(t *testing.T, db *gitobj.ObjectDatabase, buf *bytes...

FILE: lfs/gitscanner_refs.go
  type nameMap (line 14) | type nameMap struct
    method getName (line 19) | func (m *nameMap) getName(sha string) (string, bool) {
    method setName (line 26) | func (m *nameMap) setName(sha, name string) {
  function newNameMap (line 32) | func newNameMap() *nameMap {
  type lockableNameSet (line 39) | type lockableNameSet struct
    method Check (line 45) | func (s *lockableNameSet) Check(blobSha string) (string, bool) {
  function noopFoundLockable (line 61) | func noopFoundLockable(name string) {}
  function scanRefsToChan (line 68) | func scanRefsToChan(scanner *GitScanner, pointerCb GitScannerFoundPointe...
  function scanRefsToChanSingleIncludeExclude (line 125) | func scanRefsToChanSingleIncludeExclude(scanner *GitScanner, pointerCb G...
  function scanRefsToChanSingleIncludeMultiExclude (line 135) | func scanRefsToChanSingleIncludeMultiExclude(scanner *GitScanner, pointe...
  function scanRefsByTree (line 143) | func scanRefsByTree(scanner *GitScanner, pointerCb GitScannerFoundPointe...
  function revListShas (line 179) | func revListShas(scanner *GitScanner, include, exclude []string) (*Strin...

FILE: lfs/gitscanner_remotes.go
  function calcSkippedRefs (line 14) | func calcSkippedRefs(remote string) []string {

FILE: lfs/gitscanner_tree.go
  function runScanTree (line 17) | func runScanTree(cb GitScannerFoundPointer, ref string, filter *filepath...
  function runScanLFSFiles (line 42) | func runScanLFSFiles(cb GitScannerFoundPointer, ref string, filter *file...
  function catFileBatchTree (line 82) | func catFileBatchTree(treeblobs *TreeBlobChannelWrapper, gitEnv, osEnv c...
  function lsTreeBlobs (line 134) | func lsTreeBlobs(ref string, predicate func(*git.TreeBlob) bool) (*TreeB...
  function lsBlobs (line 140) | func lsBlobs(backend func() (*subprocess.BufferedCmd, error), predicate ...
  function lsFilesBlobs (line 174) | func lsFilesBlobs(predicate func(*git.TreeBlob) bool) (*TreeBlobChannelW...
  function catFileBatchTreeForPointers (line 180) | func catFileBatchTreeForPointers(treeblobs *TreeBlobChannelWrapper, gitE...
  function runScanTreeForPointers (line 270) | func runScanTreeForPointers(cb GitScannerFoundPointer, tree string, gitE...

FILE: lfs/hook.go
  type Hook (line 28) | type Hook struct
    method Exists (line 69) | func (h *Hook) Exists() bool {
    method Path (line 77) | func (h *Hook) Path() string {
    method Install (line 85) | func (h *Hook) Install(force bool) error {
    method write (line 104) | func (h *Hook) write() error {
    method Upgrade (line 112) | func (h *Hook) Upgrade() error {
    method Uninstall (line 127) | func (h *Hook) Uninstall() error {
    method matchesCurrent (line 148) | func (h *Hook) matchesCurrent() (bool, bool, error) {
  function LoadHooks (line 36) | func LoadHooks(hookDir string, cfg *config.Configuration) []*Hook {
  function NewStandardHook (line 55) | func NewStandardHook(theType, hookDir string, upgradeables []string, cfg...

FILE: lfs/lfs.go
  function Environ (line 18) | func Environ(cfg *config.Configuration, manifest tq.Manifest, envOverrid...
  function init (line 94) | func init() {
  constant gitExt (line 107) | gitExt       = ".git"
  constant gitPtrPrefix (line 108) | gitPtrPrefix = "gitdir: "
  function LinkOrCopyFromReference (line 111) | func LinkOrCopyFromReference(cfg *config.Configuration, oid string, size...

FILE: lfs/lfs_test.go
  function TestAllCurrentObjectsNone (line 14) | func TestAllCurrentObjectsNone(t *testing.T) {
  function TestAllCurrentObjectsSome (line 33) | func TestAllCurrentObjectsSome(t *testing.T) {

FILE: lfs/pointer.go
  type Pointer (line 34) | type Pointer struct
    method Encode (line 65) | func (p *Pointer) Encode(writer io.Writer) (int, error) {
    method Encoded (line 69) | func (p *Pointer) Encoded() string {
  type PointerExtension (line 44) | type PointerExtension struct
  type ByPriority (line 51) | type ByPriority
    method Len (line 53) | func (p ByPriority) Len() int           { return len(p) }
    method Swap (line 54) | func (p ByPriority) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
    method Less (line 55) | func (p ByPriority) Less(i, j int) bool { return p[i].Priority < p[j]....
  function NewPointer (line 57) | func NewPointer(oid string, size int64, exts []*PointerExtension) *Point...
  function NewPointerExtension (line 61) | func NewPointerExtension(name string, priority int, oid string) *Pointer...
  function EmptyPointer (line 84) | func EmptyPointer() *Pointer {
  function EncodePointer (line 88) | func EncodePointer(writer io.Writer, pointer *Pointer) (int, error) {
  function DecodePointerFromBlob (line 92) | func DecodePointerFromBlob(b *gitobj.Blob) (*Pointer, error) {
  function DecodePointerFromFile (line 100) | func DecodePointerFromFile(file string) (*Pointer, error) {
  function DecodePointer (line 118) | func DecodePointer(reader io.Reader) (*Pointer, error) {
  function DecodeFrom (line 129) | func DecodeFrom(reader io.Reader) (*Pointer, io.Reader, error) {
  function verifyVersion (line 154) | func verifyVersion(version string) error {
  function decodeKV (line 168) | func decodeKV(data []byte) (*Pointer, error) {
  function parseOid (line 215) | func parseOid(value string) (string, error) {
  function parsePointerExtension (line 230) | func parsePointerExtension(key string, value string) (*PointerExtension,...
  function validatePointerExtensions (line 251) | func validatePointerExtensions(exts []*PointerExtension) error {
  function decodeKVData (line 262) | func decodeKVData(data []byte) (kvps map[string]string, exts map[string]...

FILE: lfs/pointer_test.go
  function TestEncode (line 15) | func TestEncode(t *testing.T) {
  function TestEncodeEmpty (line 33) | func TestEncodeEmpty(t *testing.T) {
  function TestEncodeExtensions (line 45) | func TestEncodeExtensions(t *testing.T) {
  function assertLine (line 71) | func assertLine(t *testing.T, r *bufio.Reader, expected string) {
  function TestDecodeTinyFile (line 77) | func TestDecodeTinyFile(t *testing.T) {
  function TestDecode (line 89) | func TestDecode(t *testing.T) {
  function TestDecodeExtensions (line 102) | func TestDecodeExtensions(t *testing.T) {
  function TestDecodeExtensionsSort (line 130) | func TestDecodeExtensionsSort(t *testing.T) {
  function TestDecodePreRelease (line 158) | func TestDecodePreRelease(t *testing.T) {
  function TestDecodeFromEmptyReader (line 171) | func TestDecodeFromEmptyReader(t *testing.T) {
  function TestDecodeCanonical (line 181) | func TestDecodeCanonical(t *testing.T) {
  function TestDecodeInvalid (line 236) | func TestDecodeInvalid(t *testing.T) {
  function assertEqualWithExample (line 347) | func assertEqualWithExample(t *testing.T, example string, expected, actu...

FILE: lfs/scanner.go
  constant blobSizeCutoff (line 12) | blobSizeCutoff = 1024
  constant stdoutBufSize (line 15) | stdoutBufSize = 16384
  constant chanBufSize (line 19) | chanBufSize = 100
  type WrappedPointer (line 25) | type WrappedPointer struct
  function catFileBatchCheck (line 38) | func catFileBatchCheck(revs *StringChannelWrapper, lockableSet *lockable...
  function catFileBatch (line 55) | func catFileBatch(revs *StringChannelWrapper, lockableSet *lockableNameS...
  type PointerChannelWrapper (line 67) | type PointerChannelWrapper struct
  function NewPointerChannelWrapper (line 75) | func NewPointerChannelWrapper(pointerChan <-chan *WrappedPointer, errorC...
  type StringChannelWrapper (line 82) | type StringChannelWrapper struct
  function NewStringChannelWrapper (line 89) | func NewStringChannelWrapper(stringChan <-chan string, errorChan <-chan ...
  type TreeBlobChannelWrapper (line 95) | type TreeBlobChannelWrapper struct
  function NewTreeBlobChannelWrapper (line 102) | func NewTreeBlobChannelWrapper(treeBlobChan <-chan git.TreeBlob, errorCh...

FILE: lfs/scanner_git_test.go
  function TestScanUnpushed (line 19) | func TestScanUnpushed(t *testing.T) {
  function scanUnpushed (line 91) | func scanUnpushed(remoteName string) ([]*WrappedPointer, error) {
  function TestScanPreviousVersions (line 111) | func TestScanPreviousVersions(t *testing.T) {
  function scanPreviousVersions (line 190) | func scanPreviousVersions(t *testing.T, ref string, since time.Time) ([]...

FILE: lfs/scanner_test.go
  function TestLogScannerAdditionsNoFiltering (line 99) | func TestLogScannerAdditionsNoFiltering(t *testing.T) {
  function TestLogScannerAdditionsFilterInclude (line 152) | func TestLogScannerAdditionsFilterInclude(t *testing.T) {
  function TestLogScannerAdditionsFilterIncludeOctals (line 169) | func TestLogScannerAdditionsFilterIncludeOctals(t *testing.T) {
  function TestLogScannerAdditionsFilterExclude (line 186) | func TestLogScannerAdditionsFilterExclude(t *testing.T) {
  function TestLogScannerDeletionsNoFiltering (line 231) | func TestLogScannerDeletionsNoFiltering(t *testing.T) {
  function TestLogScannerDeletionsFilterInclude (line 274) | func TestLogScannerDeletionsFilterInclude(t *testing.T) {
  function TestLogScannerDeletionsFilterIncludeOctals (line 291) | func TestLogScannerDeletionsFilterIncludeOctals(t *testing.T) {
  function TestLogScannerDeletionsFilterExclude (line 308) | func TestLogScannerDeletionsFilterExclude(t *testing.T) {

FILE: lfs/util.go
  type Platform (line 18) | type Platform
  constant PlatformWindows (line 21) | PlatformWindows      = Platform(iota)
  constant PlatformLinux (line 22) | PlatformLinux        = Platform(iota)
  constant PlatformOSX (line 23) | PlatformOSX          = Platform(iota)
  constant PlatformOther (line 24) | PlatformOther        = Platform(iota)
  constant PlatformUndetermined (line 25) | PlatformUndetermined = Platform(iota)
  function join (line 30) | func join(parts ...string) string {
  method CopyCallbackFile (line 34) | func (f *GitFilter) CopyCallbackFile(event, filename string, index, tota...
  function wrapProgressError (line 72) | func wrapProgressError(err error, event, filename string) error {
  function GetPlatform (line 82) | func GetPlatform() Platform {
  type PathConverter (line 98) | type PathConverter interface
  function NewCurrentToRepoPathConverter (line 105) | func NewCurrentToRepoPathConverter(cfg *config.Configuration) (PathConve...
  type currentToRepoPathConverter (line 118) | type currentToRepoPathConverter struct
    method Convert (line 124) | func (p *currentToRepoPathConverter) Convert(filename string) string {
  function NewCurrentToRepoPatternConverter (line 145) | func NewCurrentToRepoPatternConverter(cfg *config.Configuration) (PathCo...
  type currentToRepoPatternConverter (line 160) | type currentToRepoPatternConverter struct
    method Convert (line 164) | func (p *currentToRepoPatternConverter) Convert(filename string) string {
  function pathConverterArgs (line 178) | func pathConverterArgs(cfg *config.Configuration) (string, string, bool,...
  function IsWindows (line 188) | func IsWindows() bool {
  function CopyFileContents (line 192) | func CopyFileContents(cfg *config.Configuration, src string, dst string)...
  function LinkOrCopy (line 217) | func LinkOrCopy(cfg *config.Configuration, src string, dst string) error {
  function TempFile (line 236) | func TempFile(cfg *config.Configuration, pattern string) (*os.File, erro...

FILE: lfs/util_test.go
  function TestBodyWithCallback (line 15) | func TestBodyWithCallback(t *testing.T) {
  function TestReadWithCallback (line 42) | func TestReadWithCallback(t *testing.T) {
  function TestCopyCallbackFileThrottle (line 72) | func TestCopyCallbackFileThrottle(t *testing.T) {

FILE: lfsapi/auth.go
  method DoWithAuth (line 26) | func (c *Client) DoWithAuth(remote string, access creds.Access, req *htt...
  method DoWithAuthNoRetry (line 48) | func (c *Client) DoWithAuthNoRetry(remote string, access creds.Access, r...
  method DoAPIRequestWithAuth (line 56) | func (c *Client) DoAPIRequestWithAuth(remote string, req *http.Request) ...
  method doWithAuth (line 63) | func (c *Client) doWithAuth(remote string, count *int, access creds.Acce...
  method doWithCreds (line 106) | func (c *Client) doWithCreds(req *http.Request, count *int, credWrapper ...
  method getCreds (line 151) | func (c *Client) getCreds(remote string, access creds.Access, req *http....
  method getGitCredsWrapper (line 195) | func (c *Client) getGitCredsWrapper(ef EndpointFinder, req *http.Request...
  function getCredURLForAPI (line 199) | func getCredURLForAPI(ef EndpointFinder, operation, remote string, apiEn...
  function fixSchemelessURL (line 246) | func fixSchemelessURL(u string) (string, bool) {
  function hasScheme (line 275) | func hasScheme(what string) bool {
  function requestHasAuth (line 285) | func requestHasAuth(req *http.Request) bool {
  function setRequestAuthFromURL (line 295) | func setRequestAuthFromURL(req *http.Request, u *url.URL) bool {
  function setRequestAuth (line 309) | func setRequestAuth(req *http.Request, user, pass string) {
  function setRequestAuthWithCreds (line 319) | func setRequestAuthWithCreds(req *http.Request, c creds.Creds) {
  function getReqOperation (line 333) | func getReqOperation(req *http.Request) string {
  function getAuthAccess (line 345) | func getAuthAccess(res *http.Response, access creds.AccessMode, modes []...

FILE: lfsapi/auth_test.go
  type authRequest (line 21) | type authRequest struct
  function TestAuthenticateHeaderAccess (line 25) | func TestAuthenticateHeaderAccess(t *testing.T) {
  function TestDualAccessModes (line 48) | func TestDualAccessModes(t *testing.T) {
  function TestDoWithAuthApprove (line 59) | func TestDoWithAuthApprove(t *testing.T) {
  function TestDoWithAuthReject (line 118) | func TestDoWithAuthReject(t *testing.T) {
  function TestDoWithAuthNoRetry (line 187) | func TestDoWithAuthNoRetry(t *testing.T) {
  function TestDoAPIRequestWithAuth (line 239) | func TestDoAPIRequestWithAuth(t *testing.T) {
  type mockCredentialHelper (line 298) | type mockCredentialHelper struct
    method Fill (line 308) | func (m *mockCredentialHelper) Fill(input creds.Creds) (creds.Creds, e...
    method Approve (line 324) | func (m *mockCredentialHelper) Approve(creds creds.Creds) error {
    method Reject (line 329) | func (m *mockCredentialHelper) Reject(creds creds.Creds) error {
    method IsApproved (line 334) | func (m *mockCredentialHelper) IsApproved(creds creds.Creds) bool {
  function newMockCredentialHelper (line 302) | func newMockCredentialHelper() *mockCredentialHelper {
  function credsToKey (line 345) | func credsToKey(creds creds.Creds) string {
  function basicAuth (line 358) | func basicAuth(user, pass string) string {
  type getCredsExpected (line 363) | type getCredsExpected struct
  type getCredsTest (line 370) | type getCredsTest struct
  function TestGetCreds (line 380) | func TestGetCreds(t *testing.T) {
  type fakeCredentialFiller (line 677) | type fakeCredentialFiller struct
    method Fill (line 679) | func (f *fakeCredentialFiller) Fill(input creds.Creds) (creds.Creds, e...
    method Approve (line 691) | func (f *fakeCredentialFiller) Approve(creds creds.Creds) error {
    method Reject (line 695) | func (f *fakeCredentialFiller) Reject(creds creds.Creds) error {
  function TestClientRedirectReauthenticate (line 699) | func TestClientRedirectReauthenticate(t *testing.T) {

FILE: lfsapi/body.go
  type ReadSeekCloser (line 11) | type ReadSeekCloser interface
  function MarshalToRequest (line 16) | func MarshalToRequest(req *http.Request, obj interface{}) error {
  function NewByteBody (line 29) | func NewByteBody(by []byte) ReadSeekCloser {
  type closingByteReader (line 33) | type closingByteReader struct
    method Close (line 37) | func (r *closingByteReader) Close() error {

FILE: lfsapi/client.go
  method NewRequest (line 12) | func (c *Client) NewRequest(method string, e lfshttp.Endpoint, suffix st...
  method Do (line 18) | func (c *Client) Do(req *http.Request) (*http.Response, error) {
  method do (line 25) | func (c *Client) do(req *http.Request, remote string, via []*http.Reques...
  method doWithAccess (line 29) | func (c *Client) doWithAccess(req *http.Request, remote string, via []*h...
  method LogRequest (line 33) | func (c *Client) LogRequest(r *http.Request, reqKey string) *http.Request {
  method GitEnv (line 37) | func (c *Client) GitEnv() config.Environment {
  method OSEnv (line 41) | func (c *Client) OSEnv() config.Environment {
  method ConcurrentTransfers (line 45) | func (c *Client) ConcurrentTransfers() int {
  method LogHTTPStats (line 49) | func (c *Client) LogHTTPStats(w io.WriteCloser) {
  method Close (line 53) | func (c *Client) Close() error {

FILE: lfsapi/endpoint_finder.go
  constant defaultRemote (line 22) | defaultRemote = "origin"
  type EndpointFinder (line 25) | type EndpointFinder interface
  type endpointGitFinder (line 36) | type endpointGitFinder struct
    method Endpoint (line 87) | func (e *endpointGitFinder) Endpoint(operation, remote string) lfshttp...
    method getEndpoint (line 93) | func (e *endpointGitFinder) getEndpoint(operation, remote string) lfsh...
    method RemoteEndpoint (line 117) | func (e *endpointGitFinder) RemoteEndpoint(operation, remote string) l...
    method GitRemoteURL (line 190) | func (e *endpointGitFinder) GitRemoteURL(remote string, forpush bool) ...
    method NewEndpointFromCloneURL (line 210) | func (e *endpointGitFinder) NewEndpointFromCloneURL(operation, rawurl ...
    method NewEndpoint (line 234) | func (e *endpointGitFinder) NewEndpoint(operation, rawurl string) lfsh...
    method AccessFor (line 277) | func (e *endpointGitFinder) AccessFor(rawurl string) creds.Access {
    method SetAccess (line 295) | func (e *endpointGitFinder) SetAccess(access creds.Access) {
    method fetchGitAccess (line 327) | func (e *endpointGitFinder) fetchGitAccess(rawurl string) creds.Access...
    method GitProtocol (line 338) | func (e *endpointGitFinder) GitProtocol() string {
    method ReplaceUrlAlias (line 345) | func (e *endpointGitFinder) ReplaceUrlAlias(operation, rawurl string) ...
    method replaceUrlAlias (line 361) | func (e *endpointGitFinder) replaceUrlAlias(aliases map[string]string,...
  function NewEndpointFinder (line 52) | func NewEndpointFinder(ctx lfshttp.Context) EndpointFinder {
  function parseFetchHead (line 156) | func parseFetchHead(filePath string) (string, error) {
  function ExtractRemoteUrl (line 172) | func ExtractRemoteUrl(line string) (string, error) {
  function urlWithoutAuth (line 312) | func urlWithoutAuth(rawurl string) string {
  constant aliasPrefix (line 381) | aliasPrefix = "url."
  function initAliases (line 384) | func initAliases(e *endpointGitFinder, git config.Environment) {
  function storeAlias (line 399) | func storeAlias(aliases map[string]string, key string, values []string, ...
  function endpointFromGitUrl (line 409) | func endpointFromGitUrl(u *url.URL, e *endpointGitFinder) lfshttp.Endpoi...

FILE: lfsapi/endpoint_finder_test.go
  function TestEndpointDefaultsToOrigin (line 15) | func TestEndpointDefaultsToOrigin(t *testing.T) {
  function TestEndpointOverridesOrigin (line 26) | func TestEndpointOverridesOrigin(t *testing.T) {
  function TestEndpointNoOverrideDefaultRemote (line 38) | func TestEndpointNoOverrideDefaultRemote(t *testing.T) {
  function TestEndpointUseAlternateRemote (line 50) | func TestEndpointUseAlternateRemote(t *testing.T) {
  function TestEndpointAddsLfsSuffix (line 62) | func TestEndpointAddsLfsSuffix(t *testing.T) {
  function TestBareEndpointAddsLfsSuffix (line 73) | func TestBareEndpointAddsLfsSuffix(t *testing.T) {
  function TestEndpointSeparateClonePushUrl (line 84) | func TestEndpointSeparateClonePushUrl(t *testing.T) {
  function TestEndpointOverriddenSeparateClonePushLfsUrl (line 101) | func TestEndpointOverriddenSeparateClonePushLfsUrl(t *testing.T) {
  function TestEndpointGlobalSeparateLfsPush (line 120) | func TestEndpointGlobalSeparateLfsPush(t *testing.T) {
  function TestSSHEndpointOverridden (line 137) | func TestSSHEndpointOverridden(t *testing.T) {
  function TestSSHEndpointAddsLfsSuffix (line 150) | func TestSSHEndpointAddsLfsSuffix(t *testing.T) {
  function TestSSHCustomPortEndpointAddsLfsSuffix (line 162) | func TestSSHCustomPortEndpointAddsLfsSuffix(t *testing.T) {
  function TestGitSSHEndpointAddsLfsSuffix (line 174) | func TestGitSSHEndpointAddsLfsSuffix(t *testing.T) {
  function TestGitSSHCustomPortEndpointAddsLfsSuffix (line 186) | func TestGitSSHCustomPortEndpointAddsLfsSuffix(t *testing.T) {
  function TestSSHGitEndpointAddsLfsSuffix (line 198) | func TestSSHGitEndpointAddsLfsSuffix(t *testing.T) {
  function TestSSHGitCustomPortEndpointAddsLfsSuffix (line 210) | func TestSSHGitCustomPortEndpointAddsLfsSuffix(t *testing.T) {
  function TestBareSSHEndpointAddsLfsSuffix (line 222) | func TestBareSSHEndpointAddsLfsSuffix(t *testing.T) {
  function TestBareSSSHEndpointWithCustomPortInBrackets (line 234) | func TestBareSSSHEndpointWithCustomPortInBrackets(t *testing.T) {
  function TestSSHEndpointFromGlobalLfsUrl (line 246) | func TestSSHEndpointFromGlobalLfsUrl(t *testing.T) {
  function TestHTTPEndpointAddsLfsSuffix (line 258) | func TestHTTPEndpointAddsLfsSuffix(t *testing.T) {
  function TestBareHTTPEndpointAddsLfsSuffix (line 270) | func TestBareHTTPEndpointAddsLfsSuffix(t *testing.T) {
  function TestGitEndpointAddsLfsSuffix (line 282) | func TestGitEndpointAddsLfsSuffix(t *testing.T) {
  function TestGitEndpointAddsLfsSuffixWithCustomProtocol (line 294) | func TestGitEndpointAddsLfsSuffixWithCustomProtocol(t *testing.T) {
  function TestBareGitEndpointAddsLfsSuffix (line 307) | func TestBareGitEndpointAddsLfsSuffix(t *testing.T) {
  function TestLocalPathEndpointAddsDotGitForWorkingRepo (line 319) | func TestLocalPathEndpointAddsDotGitForWorkingRepo(t *testing.T) {
  function TestLocalPathEndpointPreservesDotGitForWorkingRepo (line 339) | func TestLocalPathEndpointPreservesDotGitForWorkingRepo(t *testing.T) {
  function TestLocalPathEndpointPreservesNoDotGitForBareRepo (line 359) | func TestLocalPathEndpointPreservesNoDotGitForBareRepo(t *testing.T) {
  function TestLocalPathEndpointRemovesDotGitForBareRepo (line 379) | func TestLocalPathEndpointRemovesDotGitForBareRepo(t *testing.T) {
  function TestAccessConfig (line 399) | func TestAccessConfig(t *testing.T) {
  function TestAccessAbsentConfig (line 454) | func TestAccessAbsentConfig(t *testing.T) {
  function TestSetAccess (line 464) | func TestSetAccess(t *testing.T) {
  function TestChangeAccess (line 479) | func TestChangeAccess(t *testing.T) {
  function TestDeleteAccessWithNone (line 496) | func TestDeleteAccessWithNone(t *testing.T) {
  function TestDeleteAccessWithEmptyString (line 514) | func TestDeleteAccessWithEmptyString(t *testing.T) {
  type EndpointParsingTestCase (line 532) | type EndpointParsingTestCase struct
    method Assert (line 537) | func (c *EndpointParsingTestCase) Assert(t *testing.T) {
  function TestEndpointParsing (line 545) | func TestEndpointParsing(t *testing.T) {
  type InsteadOfTestCase (line 631) | type InsteadOfTestCase struct
    method Assert (line 637) | func (c *InsteadOfTestCase) Assert(t *testing.T) {
  function TestInsteadOf (line 648) | func TestInsteadOf(t *testing.T) {
  function TestNewEndpointFromCloneURLWithConfig (line 713) | func TestNewEndpointFromCloneURLWithConfig(t *testing.T) {
  function TestExtractRemoteUrlForHTTPS (line 731) | func TestExtractRemoteUrlForHTTPS(t *testing.T) {
  function TestExtractRemoteUrlForSSH (line 740) | func TestExtractRemoteUrlForSSH(t *testing.T) {
  function TestExtractRemoteUrlForGit (line 749) | func TestExtractRemoteUrlForGit(t *testing.T) {
  function TestExtractRemoteUrlNoURL (line 758) | func TestExtractRemoteUrlNoURL(t *testing.T) {

FILE: lfsapi/kerberos.go
  method doWithNegotiate (line 9) | func (c *Client) doWithNegotiate(req *http.Request, credWrapper creds.Cr...

FILE: lfsapi/lfsapi.go
  type Client (line 13) | type Client struct
    method Context (line 48) | func (c *Client) Context() lfshttp.Context {
    method SSHTransfer (line 55) | func (c *Client) SSHTransfer(operation, remote string) *ssh.SSHTransfer {
  function NewClient (line 24) | func NewClient(ctx lfshttp.Context) (*Client, error) {

FILE: lfsapi/response_test.go
  function TestAuthErrWithBody (line 14) | func TestAuthErrWithBody(t *testing.T) {
  function TestFatalWithBody (line 40) | func TestFatalWithBody(t *testing.T) {
  function TestWithNonFatal500WithBody (line 66) | func TestWithNonFatal500WithBody(t *testing.T) {
  function TestAuthErrWithoutBody (line 103) | func TestAuthErrWithoutBody(t *testing.T) {
  function TestFatalWithoutBody (line 127) | func TestFatalWithoutBody(t *testing.T) {
  function TestWithNonFatal500WithoutBody (line 151) | func TestWithNonFatal500WithoutBody(t *testing.T) {

FILE: lfshttp/body.go
  type ReadSeekCloser (line 11) | type ReadSeekCloser interface
  function MarshalToRequest (line 16) | func MarshalToRequest(req *http.Request, obj interface{}) error {
  function NewByteBody (line 29) | func NewByteBody(by []byte) ReadSeekCloser {
  type closingByteReader (line 33) | type closingByteReader struct
    method Close (line 37) | func (r *closingByteReader) Close() error {

FILE: lfshttp/certs.go
  function isCertVerificationDisabledForHost (line 21) | func isCertVerificationDisabledForHost(c *Client, host string) bool {
  function isClientCertEnabledForHost (line 32) | func isClientCertEnabledForHost(c *Client, host string) bool {
  function decryptPEMBlock (line 42) | func decryptPEMBlock(c *Client, block *pem.Block, path string, key []byt...
  function getClientCertForHost (line 73) | func getClientCertForHost(c *Client, host string) (*tls.Certificate, err...
  function getRootCAsForHostFromGitconfig (line 123) | func getRootCAsForHostFromGitconfig(c *Client, host string) *x509.CertPo...
  function appendCertsFromFilesInDir (line 160) | func appendCertsFromFilesInDir(pool *x509.CertPool, dir string) *x509.Ce...
  function appendCertsFromFile (line 176) | func appendCertsFromFile(pool *x509.CertPool, filename string) *x509.Cer...
  function appendCerts (line 194) | func appendCerts(pool *x509.CertPool, certs []*x509.Certificate) *x509.C...
  function appendCertsFromPEMData (line 211) | func appendCertsFromPEMData(pool *x509.CertPool, data []byte) *x509.Cert...

FILE: lfshttp/certs_test.go
  function clientForHost (line 52) | func clientForHost(c *Client, host string) *http.Client {
  function TestCertFromSSLCAInfoConfig (line 58) | func TestCertFromSSLCAInfoConfig(t *testing.T) {
  function TestCertFromSSLCAInfoEnv (line 104) | func TestCertFromSSLCAInfoEnv(t *testing.T) {
  function TestCertFromSSLCAInfoEnvIsIgnoredForSchannelBackend (line 125) | func TestCertFromSSLCAInfoEnvIsIgnoredForSchannelBackend(t *testing.T) {
  function TestCertFromSSLCAInfoEnvWithSchannelBackend (line 148) | func TestCertFromSSLCAInfoEnvWithSchannelBackend(t *testing.T) {
  function TestCertFromSSLCAPathConfig (line 172) | func TestCertFromSSLCAPathConfig(t *testing.T) {
  function TestCertFromSSLCAPathEnv (line 191) | func TestCertFromSSLCAPathEnv(t *testing.T) {
  function TestCertVerifyDisabledGlobalEnv (line 209) | func TestCertVerifyDisabledGlobalEnv(t *testing.T) {
  function TestCertVerifyDisabledGlobalConfig (line 230) | func TestCertVerifyDisabledGlobalConfig(t *testing.T) {
  function TestCertVerifyDisabledHostConfig (line 250) | func TestCertVerifyDisabledHostConfig(t *testing.T) {

FILE: lfshttp/client.go
  constant MediaType (line 29) | MediaType = "application/vnd.git-lfs+json"
  constant RequestContentType (line 30) | RequestContentType = MediaType + "; charset=utf-8"
  type hostData (line 37) | type hostData struct
  type Client (line 42) | type Client struct
    method GitEnv (line 102) | func (c *Client) GitEnv() config.Environment {
    method OSEnv (line 106) | func (c *Client) OSEnv() config.Environment {
    method URLConfig (line 110) | func (c *Client) URLConfig() *config.URLConfig {
    method NewRequest (line 114) | func (c *Client) NewRequest(method string, e Endpoint, suffix string, ...
    method Do (line 168) | func (c *Client) Do(req *http.Request) (*http.Response, error) {
    method DoWithAccess (line 177) | func (c *Client) DoWithAccess(req *http.Request, mode creds.AccessMode...
    method do (line 186) | func (c *Client) do(req *http.Request, remote string, via []*http.Requ...
    method Close (line 203) | func (c *Client) Close() error {
    method sshResolveWithRetries (line 207) | func (c *Client) sshResolveWithRetries(e Endpoint, method string) (*ss...
    method ExtraHeadersFor (line 237) | func (c *Client) ExtraHeadersFor(req *http.Request) http.Header {
    method extraHeaders (line 256) | func (c *Client) extraHeaders(u *url.URL) map[string][]string {
    method DoWithRedirect (line 280) | func (c *Client) DoWithRedirect(cli *http.Client, req *http.Request, r...
    method doWithRedirects (line 365) | func (c *Client) doWithRedirects(cli *http.Client, req *http.Request, ...
    method configureProtocols (line 378) | func (c *Client) configureProtocols(u *url.URL, transport *http.Transp...
    method Transport (line 398) | func (c *Client) Transport(u *url.URL, access creds.AccessMode) (http....
    method HttpClient (line 500) | func (c *Client) HttpClient(u *url.URL, access creds.AccessMode) (*htt...
    method CurrentUser (line 545) | func (c *Client) CurrentUser() (string, string) {
  function NewClient (line 69) | func NewClient(ctx Context) (*Client, error) {
  constant slash (line 157) | slash = "/"
  function joinURL (line 159) | func joinURL(prefix, suffix string) string {
  function newRequestForRetry (line 551) | func newRequestForRetry(req *http.Request, location string) (*http.Reque...
  type deadlineConn (line 586) | type deadlineConn struct
    method Read (line 591) | func (c *deadlineConn) Read(b []byte) (int, error) {
    method Write (line 598) | func (c *deadlineConn) Write(b []byte) (int, error) {
  function init (line 606) | func init() {
  type testEnv (line 610) | type testEnv
    method Get (line 612) | func (e testEnv) Get(key string) (v string, ok bool) {
    method GetAll (line 617) | func (e testEnv) GetAll(key string) []string {
    method Int (line 624) | func (e testEnv) Int(key string, def int) int {
    method Int64 (line 629) | func (e testEnv) Int64(key string, def int64) int64 {
    method Bool (line 634) | func (e testEnv) Bool(key string, def bool) bool {
    method All (line 639) | func (e testEnv) All() map[string][]string {

FILE: lfshttp/client_test.go
  type redirectTest (line 17) | type redirectTest struct
  function TestClientRedirect (line 21) | func TestClientRedirect(t *testing.T) {
  function TestNewClient (line 179) | func TestNewClient(t *testing.T) {
  function TestNewClientWithGitSSLVerify (line 194) | func TestNewClientWithGitSSLVerify(t *testing.T) {
  function TestNewClientWithOSSSLVerify (line 218) | func TestNewClientWithOSSSLVerify(t *testing.T) {
  function TestNewRequest (line 242) | func TestNewRequest(t *testing.T) {
  function TestNewRequestWithBody (line 261) | func TestNewRequestWithBody(t *testing.T) {
  function TestMarshalToRequest (line 276) | func TestMarshalToRequest(t *testing.T) {
  function TestHttp2 (line 294) | func TestHttp2(t *testing.T) {
  function TestHttpVersion (line 339) | func TestHttpVersion(t *testing.T) {

FILE: lfshttp/cookies.go
  function isCookieJarEnabledForHost (line 11) | func isCookieJarEnabledForHost(c *Client, host string) bool {
  function getCookieJarForHost (line 17) | func getCookieJarForHost(c *Client, host string) (http.CookieJar, error) {

FILE: lfshttp/endpoint.go
  constant UrlUnknown (line 13) | UrlUnknown = "<unknown>"
  type Endpoint (line 16) | type Endpoint struct
  function endpointOperation (line 23) | func endpointOperation(e Endpoint, method string) string {
  function EndpointFromSshUrl (line 37) | func EndpointFromSshUrl(u *url.URL) Endpoint {
  function EndpointFromBareSshUrl (line 73) | func EndpointFromBareSshUrl(rawurl string) Endpoint {
  function EndpointFromHttpUrl (line 104) | func EndpointFromHttpUrl(u *url.URL) Endpoint {
  function EndpointFromLocalPath (line 109) | func EndpointFromLocalPath(path string) Endpoint {
  function EndpointFromFileUrl (line 115) | func EndpointFromFileUrl(u *url.URL) Endpoint {

FILE: lfshttp/errors.go
  type httpError (line 11) | type httpError interface
  function IsHTTP (line 16) | func IsHTTP(err error) (*http.Response, bool) {
  type ClientError (line 23) | type ClientError struct
    method HTTPResponse (line 30) | func (e *ClientError) HTTPResponse() *http.Response {
    method Error (line 34) | func (e *ClientError) Error() string {
  method handleResponse (line 38) | func (c *Client) handleResponse(res *http.Response) error {
  type statusCodeError (line 82) | type statusCodeError struct
    method Error (line 90) | func (e *statusCodeError) Error() string {
    method HTTPResponse (line 99) | func (e *statusCodeError) HTTPResponse() *http.Response {
  function NewStatusCodeError (line 86) | func NewStatusCodeError(res *http.Response) error {
  function defaultError (line 103) | func defaultError(res *http.Response) error {

FILE: lfshttp/lfshttp.go
  type Context (line 19) | type Context interface
  function NewContext (line 25) | func NewContext(gitConf *git.Configuration, osEnv, gitEnv map[string]str...
  type testContext (line 44) | type testContext struct
    method GitConfig (line 50) | func (c *testContext) GitConfig() *git.Configuration {
    method OSEnv (line 54) | func (c *testContext) OSEnv() config.Environment {
    method GitEnv (line 58) | func (c *testContext) GitEnv() config.Environment {
  function IsDecodeTypeError (line 62) | func IsDecodeTypeError(err error) bool {
  type decodeTypeError (line 67) | type decodeTypeError struct
    method TypeError (line 71) | func (e *decodeTypeError) TypeError() {}
    method Error (line 73) | func (e *decodeTypeError) Error() string {
  function DecodeJSON (line 77) | func DecodeJSON(res *http.Response, obj interface{}) error {

FILE: lfshttp/proxy.go
  function proxyFromClient (line 13) | func proxyFromClient(c *Client) func(req *http.Request) (*url.URL, error) {
  function getProxyServers (line 54) | func getProxyServers(u *url.URL, urlCfg *config.URLConfig, osEnv config....

FILE: lfshttp/proxy_test.go
  function TestHttpsProxyFromGitConfig (line 11) | func TestHttpsProxyFromGitConfig(t *testing.T) {
  function TestProxyForURL (line 27) | func TestProxyForURL(t *testing.T) {
  function TestHttpProxyFromGitConfig (line 42) | func TestHttpProxyFromGitConfig(t *testing.T) {
  function TestProxyFromEnvironment (line 58) | func TestProxyFromEnvironment(t *testing.T) {
  function TestHTTPSProxyFromEnvironment (line 72) | func TestHTTPSProxyFromEnvironment(t *testing.T) {
  function TestHTTPProxyFromEnvironment (line 86) | func TestHTTPProxyFromEnvironment(t *testing.T) {
  function TestProxyIsNil (line 100) | func TestProxyIsNil(t *testing.T) {
  function TestProxyNoProxy (line 111) | func TestProxyNoProxy(t *testing.T) {
  function TestProxyNoProxyWithWildcard (line 127) | func TestProxyNoProxyWithWildcard(t *testing.T) {
  function TestSocksProxyFromEnvironment (line 143) | func TestSocksProxyFromEnvironment(t *testing.T) {
  function TestSocks5hProxyFromEnvironment (line 158) | func TestSocks5hProxyFromEnvironment(t *testing.T) {

FILE: lfshttp/retries.go
  type ckey (line 9) | type ckey
  constant contextKeyRetries (line 14) | contextKeyRetries ckey = "retries"
  constant defaultRequestRetries (line 18) | defaultRequestRetries = 0
  function WithRetries (line 24) | func WithRetries(req *http.Request, n int) *http.Request {
  function Retries (line 32) | func Retries(req *http.Request) (int, bool) {

FILE: lfshttp/retries_test.go
  function TestWithRetries (line 14) | func TestWithRetries(t *testing.T) {
  function TestRetriesOnUnannotatedRequest (line 23) | func TestRetriesOnUnannotatedRequest(t *testing.T) {
  function TestRequestWithRetries (line 31) | func TestRequestWithRetries(t *testing.T) {

FILE: lfshttp/ssh.go
  type SSHResolver (line 16) | type SSHResolver interface
  function withSSHCache (line 20) | func withSSHCache(ssh SSHResolver) SSHResolver {
  type sshCache (line 27) | type sshCache struct
    method Resolve (line 32) | func (c *sshCache) Resolve(e Endpoint, method string) (sshAuthResponse...
  type sshAuthResponse (line 56) | type sshAuthResponse struct
    method IsExpiredWithin (line 66) | func (r *sshAuthResponse) IsExpiredWithin(d time.Duration) (time.Time,...
  type sshAuthClient (line 71) | type sshAuthClient struct
    method Resolve (line 76) | func (c *sshAuthClient) Resolve(e Endpoint, method string) (sshAuthRes...

FILE: lfshttp/ssh_test.go
  function TestSSHCacheResolveFromCache (line 12) | func TestSSHCacheResolveFromCache(t *testing.T) {
  function TestSSHCacheResolveFromCacheWithFutureExpiresAt (line 34) | func TestSSHCacheResolveFromCacheWithFutureExpiresAt(t *testing.T) {
  function TestSSHCacheResolveFromCacheWithFutureExpiresIn (line 57) | func TestSSHCacheResolveFromCacheWithFutureExpiresIn(t *testing.T) {
  function TestSSHCacheResolveFromCacheWithPastExpiresAt (line 80) | func TestSSHCacheResolveFromCacheWithPastExpiresAt(t *testing.T) {
  function TestSSHCacheResolveFromCacheWithPastExpiresIn (line 103) | func TestSSHCacheResolveFromCacheWithPastExpiresIn(t *testing.T) {
  function TestSSHCacheResolveFromCacheWithAmbiguousExpirationInfo (line 126) | func TestSSHCacheResolveFromCacheWithAmbiguousExpirationInfo(t *testing....
  function TestSSHCacheResolveWithoutError (line 150) | func TestSSHCacheResolveWithoutError(t *testing.T) {
  function TestSSHCacheResolveWithError (line 182) | func TestSSHCacheResolveWithError(t *testing.T) {
  function newFakeResolver (line 209) | func newFakeResolver() *fakeResolver {
  type fakeResolver (line 213) | type fakeResolver struct
    method Resolve (line 217) | func (r *fakeResolver) Resolve(e Endpoint, method string) (sshAuthResp...

FILE: lfshttp/standalone/standalone.go
  type inputMessage (line 27) | type inputMessage struct
  type errorMessage (line 38) | type errorMessage struct
  type outputErrorMessage (line 43) | type outputErrorMessage struct
  type completeMessage (line 48) | type completeMessage struct
  type fileHandler (line 55) | type fileHandler struct
    method dispatch (line 210) | func (h *fileHandler) dispatch(msg *inputMessage) bool {
    method respond (line 228) | func (h *fileHandler) respond(oid string, path string, err error) {
    method upload (line 242) | func (h *fileHandler) upload(oid string, size int64, path string) (str...
    method download (line 256) | func (h *fileHandler) download(oid string, size int64) (string, string...
  function fileUrlFromRemote (line 67) | func fileUrlFromRemote(cfg *config.Configuration, name string, direction...
  function gitDirAtPath (line 100) | func gitDirAtPath(path string) (string, error) {
  function fixUrlPath (line 157) | func fixUrlPath(path string) string {
  function newHandler (line 174) | func newHandler(cfg *config.Configuration, output *os.File, msg *inputMe...
  function standaloneFailure (line 278) | func standaloneFailure(msg string, err error) {
  function ProcessStandaloneData (line 286) | func ProcessStandaloneData(cfg *config.Configuration, input *os.File, ou...

FILE: lfshttp/stats.go
  type httpTransfer (line 16) | type httpTransfer struct
  type statsContextKey (line 34) | type statsContextKey
  constant transferKey (line 36) | transferKey = statsContextKey("transfer")
  method LogHTTPStats (line 38) | func (c *Client) LogHTTPStats(w io.WriteCloser) {
  method LogStats (line 48) | func (c *Client) LogStats(out io.Writer) {}
  method LogRequest (line 52) | func (c *Client) LogRequest(r *http.Request, reqKey string) *http.Request {
  method LogResponse (line 96) | func (c *Client) LogResponse(key string, res *http.Response) {}
  function newSyncLogger (line 98) | func newSyncLogger(w io.WriteCloser) *syncLogger {
  type syncLogger (line 113) | type syncLogger struct
    method LogRequest (line 119) | func (l *syncLogger) LogRequest(req *http.Request, bodySize int64) {
    method LogResponse (line 129) | func (l *syncLogger) LogResponse(req *http.Request, status int, bodySi...
    method logTransfer (line 150) | func (l *syncLogger) logTransfer(t *httpTransfer, event, extra string) {
    method Close (line 161) | func (l *syncLogger) Close() error {

FILE: lfshttp/stats_test.go
  function TestStatsWithKey (line 17) | func TestStatsWithKey(t *testing.T) {
  function TestStatsWithoutKey (line 83) | func TestStatsWithoutKey(t *testing.T) {
  function TestStatsDisabled (line 126) | func TestStatsDisabled(t *testing.T) {
  function nopCloser (line 168) | func nopCloser(w io.Writer) io.WriteCloser {
  type nopWCloser (line 172) | type nopWCloser struct
    method Close (line 176) | func (w nopWCloser) Close() error {

FILE: lfshttp/verbose.go
  method traceRequest (line 17) | func (c *Client) traceRequest(req *http.Request) (*tracedRequest, error) {
  type tracedRequest (line 45) | type tracedRequest struct
    method Read (line 52) | func (r *tracedRequest) Read(b []byte) (int, error) {
  method traceResponse (line 58) | func (c *Client) traceResponse(req *http.Request, tracedReq *tracedReque...
  type tracedResponse (line 94) | type tracedResponse struct
    method Read (line 105) | func (r *tracedResponse) Read(b []byte) (int, error) {
  function tracedRead (line 116) | func tracedRead(r io.Reader, b []byte, verboseOut io.Writer, gitTrace, v...
  method traceHTTPDump (line 134) | func (c *Client) traceHTTPDump(direction string, dump []byte) {
  function isTraceableContent (line 149) | func isTraceableContent(h http.Header) bool {
  function traceReq (line 159) | func traceReq(req *http.Request) string {

FILE: lfshttp/verbose_test.go
  type verboseTest (line 17) | type verboseTest struct
  function TestVerboseEnabled (line 21) | func TestVerboseEnabled(t *testing.T) {
  function TestVerboseWithBinaryBody (line 79) | func TestVerboseWithBinaryBody(t *testing.T) {
  function TestVerboseEnabledWithDebugging (line 136) | func TestVerboseEnabledWithDebugging(t *testing.T) {
  function TestVerboseDisabled (line 195) | func TestVerboseDisabled(t *testing.T) {

FILE: locking/api.go
  type lockClient (line 15) | type lockClient interface
  type httpLockClient (line 22) | type httpLockClient struct
    method Lock (line 62) | func (c *httpLockClient) Lock(remote string, lockReq *lockRequest) (*l...
    method Unlock (line 113) | func (c *httpLockClient) Unlock(ref *git.Ref, remote, id string, force...
    method Search (line 210) | func (c *httpLockClient) Search(remote string, searchReq *lockSearchRe...
    method SearchVerifiable (line 279) | func (c *httpLockClient) SearchVerifiable(remote string, vreq *lockVer...
  type lockRef (line 26) | type lockRef struct
  type lockRequest (line 32) | type lockRequest struct
  type lockResponse (line 40) | type lockResponse struct
  type unlockRequest (line 90) | type unlockRequest struct
  type unlockResponse (line 100) | type unlockResponse struct
  type lockFilter (line 145) | type lockFilter struct
  type lockSearchRequest (line 153) | type lockSearchRequest struct
    method QueryValues (line 170) | func (r *lockSearchRequest) QueryValues() map[string]string {
  type lockList (line 192) | type lockList struct
  type lockVerifiableRequest (line 242) | type lockVerifiableRequest struct
  type lockVerifiableList (line 257) | type lockVerifiableList struct
  type User (line 304) | type User struct
    method String (line 315) | func (u *User) String() string {
  function NewUser (line 310) | func NewUser(name string) *User {
  type lockClientInfo (line 319) | type lockClientInfo struct
  type genericLockClient (line 324) | type genericLockClient struct
    method getClient (line 336) | func (c *genericLockClient) getClient(remote, operation string) lockCl...
    method Lock (line 355) | func (c *genericLockClient) Lock(remote string, lockReq *lockRequest) ...
    method Unlock (line 359) | func (c *genericLockClient) Unlock(ref *git.Ref, remote, id string, fo...
    method Search (line 363) | func (c *genericLockClient) Search(remote string, searchReq *lockSearc...
    method SearchVerifiable (line 367) | func (c *genericLockClient) SearchVerifiable(remote string, vreq *lock...
  function newGenericLockClient (line 329) | func newGenericLockClient(client *lfsapi.Client) *genericLockClient {

FILE: locking/api_test.go
  function TestAPILock (line 21) | func TestAPILock(t *testing.T) {
  function TestAPIUnlock (line 71) | func TestAPIUnlock(t *testing.T) {
  function TestAPISearch (line 123) | func TestAPISearch(t *testing.T) {
  function TestAPISearchVerifiable (line 174) | func TestAPISearchVerifiable(t *testing.T) {
  function init (line 236) | func init() {
  type sourcedSchema (line 250) | type sourcedSchema struct
  function getSchema (line 255) | func getSchema(wd, relpath string) *sourcedSchema {
  function assertSchema (line 264) | func assertSchema(t *testing.T, schema *sourcedSchema, dataLoader gojson...

FILE: locking/cache.go
  constant idKeyPrefix (line 13) | idKeyPrefix string = "*id*://"
  type LockCache (line 16) | type LockCache struct
    method Add (line 29) | func (c *LockCache) Add(l Lock) error {
    method RemoveByPath (line 39) | func (c *LockCache) RemoveByPath(filePath string) error {
    method RemoveById (line 50) | func (c *LockCache) RemoveById(id string) error {
    method Locks (line 62) | func (c *LockCache) Locks() []Lock {
    method Clear (line 76) | func (c *LockCache) Clear() {
    method Save (line 81) | func (c *LockCache) Save() error {
    method encodeIdKey (line 85) | func (c *LockCache) encodeIdKey(id string) string {
    method decodeIdKey (line 93) | func (c *LockCache) decodeIdKey(key string) string {
    method isIdKey (line 101) | func (c *LockCache) isIdKey(key string) bool {
  function NewLockCache (line 20) | func NewLockCache(filepath string) (*LockCache, error) {

FILE: locking/cache_test.go
  function TestLockCache (line 10) | func TestLockCache(t *testing.T) {

FILE: locking/lockable.go
  method GetLockablePatterns (line 18) | func (c *Client) GetLockablePatterns() []string {
  method getLockableFilter (line 24) | func (c *Client) getLockableFilter() *filepathfilter.Filter {
  method ensureLockablesLoaded (line 29) | func (c *Client) ensureLockablesLoaded() {
  method refreshLockablePatterns (line 41) | func (c *Client) refreshLockablePatterns() {
  method IsFileLockable (line 57) | func (c *Client) IsFileLockable(path string) bool {
  method FixAllLockableFileWriteFlags (line 68) | func (c *Client) FixAllLockableFileWriteFlags() error {
  method FixFileWriteFlagsInDir (line 81) | func (c *Client) FixFileWriteFlagsInDir(dir string, lockablePatterns, un...
  method fixFileWriteFlags (line 113) | func (c *Client) fixFileWriteFlags(absPath, workingDir string, lockable,...
  method FixLockableFileWriteFlags (line 139) | func (c *Client) FixLockableFileWriteFlags(files []string) error {
  method fixSingleFileWriteFlags (line 163) | func (c *Client) fixSingleFileWriteFlags(file string, lockable, unlockab...

FILE: locking/locks.go
  type LockCacher (line 32) | type LockCacher interface
  type Client (line 42) | type Client struct
    method SetupFileCache (line 75) | func (c *Client) SetupFileCache(path string) error {
    method Close (line 97) | func (c *Client) Close() error {
    method LockFile (line 104) | func (c *Client) LockFile(path string) (Lock, error) {
    method getAbsolutePath (line 146) | func (c *Client) getAbsolutePath(p string) (string, error) {
    method UnlockFile (line 153) | func (c *Client) UnlockFile(path string, force bool) error {
    method UnlockFileById (line 164) | func (c *Client) UnlockFileById(id string, force bool) error {
    method SearchLocks (line 213) | func (c *Client) SearchLocks(filter map[string]string, limit int, loca...
    method SearchLocksVerifiable (line 242) | func (c *Client) SearchLocksVerifiable(limit int, cached bool) (ourLoc...
    method searchLocalLocks (line 322) | func (c *Client) searchLocalLocks(filter map[string]string, limit int)...
    method searchRemoteLocks (line 343) | func (c *Client) searchRemoteLocks(filter map[string]string, limit int...
    method lockIdFromPath (line 397) | func (c *Client) lockIdFromPath(path string) (string, error) {
    method IsFileLockedByCurrentCommitter (line 421) | func (c *Client) IsFileLockedByCurrentCommitter(path string) bool {
    method prepareCacheDirectory (line 435) | func (c *Client) prepareCacheDirectory(kind string) (string, error) {
    method readLocksFromCacheFile (line 458) | func (c *Client) readLocksFromCacheFile(kind string, decoder func(*jso...
    method EncodeLocks (line 482) | func (c *Client) EncodeLocks(locks []Lock, writer io.Writer) error {
    method EncodeLocksVerifiable (line 486) | func (c *Client) EncodeLocksVerifiable(ourLocks, theirLocks []Lock, wr...
    method writeLocksToCacheFile (line 493) | func (c *Client) writeLocksToCacheFile(kind string, writer func(io.Wri...
  function NewClient (line 63) | func NewClient(remote string, lfsClient *lfsapi.Client, cfg *config.Conf...
  type Lock (line 197) | type Lock struct
  function init (line 431) | func init() {
  type nilLockCacher (line 508) | type nilLockCacher struct
    method Add (line 510) | func (c *nilLockCacher) Add(l Lock) error {
    method RemoveByPath (line 513) | func (c *nilLockCacher) RemoveByPath(filePath string) error {
    method RemoveById (line 516) | func (c *nilLockCacher) RemoveById(id string) error {
    method Locks (line 519) | func (c *nilLockCacher) Locks() []Lock {
    method Clear (line 522) | func (c *nilLockCacher) Clear() {}
    method Save (line 523) | func (c *nilLockCacher) Save() error {

FILE: locking/locks_test.go
  type LocksById (line 20) | type LocksById
    method Len (line 22) | func (a LocksById) Len() int           { return len(a) }
    method Swap (line 23) | func (a LocksById) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
    method Less (line 24) | func (a LocksById) Less(i, j int) bool { return a[i].Id < a[j].Id }
  function TestRemoteLocksWithCache (line 26) | func TestRemoteLocksWithCache(t *testing.T) {
  function TestRefreshCache (line 130) | func TestRefreshCache(t *testing.T) {
  function TestSearchLocksVerifiableWithCache (line 193) | func TestSearchLocksVerifiableWithCache(t *testing.T) {

FILE: locking/ssh.go
  type sshLockClient (line 15) | type sshLockClient struct
    method connection (line 20) | func (c *sshLockClient) connection() (*ssh.PktlineConnection, error) {
    method parseLockResponse (line 24) | func (c *sshLockClient) parseLockResponse(status int, args []string, l...
    method lockDataIsIncomplete (line 73) | func (c *sshLockClient) lockDataIsIncomplete(data *lockData) bool {
    method parseListLockResponse (line 77) | func (c *sshLockClient) parseListLockResponse(status int, args []strin...
    method Lock (line 143) | func (c *sshLockClient) Lock(remote string, lockReq *lockRequest) (*lo...
    method Unlock (line 169) | func (c *sshLockClient) Unlock(ref *git.Ref, remote, id string, force ...
    method Search (line 194) | func (c *sshLockClient) Search(remote string, searchReq *lockSearchReq...
    method SearchVerifiable (line 226) | func (c *sshLockClient) SearchVerifiable(remote string, vreq *lockVeri...
  type owner (line 60) | type owner
  constant ownerOurs (line 63) | ownerOurs    = owner("ours")
  constant ownerTheirs (line 64) | ownerTheirs  = owner("theirs")
  constant ownerUnknown (line 65) | ownerUnknown = owner("")
  type lockData (line 68) | type lockData struct

FILE: script/lib/distro.rb
  class DistroMap (line 5) | class DistroMap
    method initialize (line 8) | def initialize(map = nil)
    method builtin_map (line 23) | def self.builtin_map
    method distro_name_map (line 101) | def distro_name_map
    method image_names (line 105) | def image_names
  class DistroMapProgram (line 110) | class DistroMapProgram
    method initialize (line 111) | def initialize(stdout, stderr, dmap = nil)
    method image_names (line 117) | def image_names
    method distro_markdown (line 121) | def distro_markdown
    method run (line 137) | def run(args)

FILE: script/packagecloud.rb
  function distro_names_for (line 34) | def distro_names_for(filename)

FILE: script/spec/distro_spec.rb
  function test_map (line 3) | def test_map

FILE: ssh/connection.go
  type SSHTransfer (line 15) | type SSHTransfer struct
    method IsMultiplexingEnabled (line 92) | func (st *SSHTransfer) IsMultiplexingEnabled() bool {
    method Connection (line 101) | func (st *SSHTransfer) Connection(n int) (*PktlineConnection, error) {
    method ConnectionCount (line 127) | func (st *SSHTransfer) ConnectionCount() int {
    method SetConnectionCount (line 134) | func (st *SSHTransfer) SetConnectionCount(n int) error {
    method SetConnectionCountAtLeast (line 142) | func (st *SSHTransfer) SetConnectionCountAtLeast(n int) error {
    method spawnConnection (line 152) | func (st *SSHTransfer) spawnConnection(n int) (*PktlineConnection, str...
    method setConnectionCount (line 161) | func (st *SSHTransfer) setConnectionCount(n int) error {
    method Shutdown (line 204) | func (st *SSHTransfer) Shutdown() error {
  function NewSSHTransfer (line 26) | func NewSSHTransfer(osEnv config.Environment, gitEnv config.Environment,...
  function startConnection (line 43) | func startConnection(id int, osEnv config.Environment, gitEnv config.Env...

FILE: ssh/pktline.go
  function pktlineReader (line 10) | func pktlineReader(p Pktline) io.Reader {
  type Pktline (line 18) | type Pktline interface
  type TraceablePktline (line 27) | type TraceablePktline struct
    method ReadPacketList (line 32) | func (tp *TraceablePktline) ReadPacketList() ([]string, error) {
    method ReadPacketTextWithLength (line 55) | func (tp *TraceablePktline) ReadPacketTextWithLength() (string, int, e...
    method WritePacket (line 69) | func (tp *TraceablePktline) WritePacket(b []byte) error {
    method WritePacketText (line 74) | func (tp *TraceablePktline) WritePacketText(s string) error {
    method WriteDelim (line 79) | func (tp *TraceablePktline) WriteDelim() error {
    method WriteFlush (line 84) | func (tp *TraceablePktline) WriteFlush() error {

FILE: ssh/protocol.go
  type PktlineConnection (line 14) | type PktlineConnection struct
    method Lock (line 22) | func (conn *PktlineConnection) Lock() {
    method Unlock (line 26) | func (conn *PktlineConnection) Unlock() {
    method Start (line 30) | func (conn *PktlineConnection) Start() error {
    method End (line 36) | func (conn *PktlineConnection) End() error {
    method negotiateVersion (line 50) | func (conn *PktlineConnection) negotiateVersion() error {
    method SendMessage (line 82) | func (conn *PktlineConnection) SendMessage(command string, args []stri...
    method SendMessageWithLines (line 96) | func (conn *PktlineConnection) SendMessageWithLines(command string, ar...
    method SendMessageWithData (line 120) | func (conn *PktlineConnection) SendMessageWithData(command string, arg...
    method ReadStatus (line 151) | func (conn *PktlineConnection) ReadStatus() (int, error) {
    method ReadStatusWithData (line 183) | func (conn *PktlineConnection) ReadStatusWithData() (int, []string, io...
    method ReadStatusWithLines (line 218) | func (conn *PktlineConnection) ReadStatusWithLines() (int, []string, [...

FILE: ssh/ssh.go
  type sshVariant (line 18) | type sshVariant
  constant variantSSH (line 21) | variantSSH      = sshVariant("ssh")
  constant variantSimple (line 22) | variantSimple   = sshVariant("simple")
  constant variantPutty (line 23) | variantPutty    = sshVariant("putty")
  constant variantTortoise (line 24) | variantTortoise = sshVariant("tortoiseplink")
  type SSHMetadata (line 27) | type SSHMetadata struct
  function FormatArgs (line 33) | func FormatArgs(cmd string, args []string, needShell bool) (string, []st...
  function GetLFSExeAndArgs (line 41) | func GetLFSExeAndArgs(osEnv config.Environment, gitEnv config.Environmen...
  function parseShellCommand (line 52) | func parseShellCommand(command string, existing string) (ssh string, cmd...
  function findVariant (line 62) | func findVariant(variant string) (bool, sshVariant) {
  function autodetectVariant (line 75) | func autodetectVariant(osEnv config.Environment, gitEnv config.Environme...
  function getVariant (line 91) | func getVariant(osEnv config.Environment, gitEnv config.Environment, bas...
  function findRuntimeDir (line 105) | func findRuntimeDir(osEnv config.Environment) string {
  function getControlDir (line 112) | func getControlDir(osEnv config.Environment) (string, error) {
  function GetExeAndArgs (line 127) | func GetExeAndArgs(osEnv config.Environment, gitEnv config.Environment, ...
  constant defaultSSHCmd (line 201) | defaultSSHCmd = "ssh"

FILE: ssh/ssh_test.go
  function TestSSHGetLFSExeAndArgs (line 15) | func TestSSHGetLFSExeAndArgs(t *testing.T) {
  function TestSSHGetExeAndArgsSsh (line 38) | func TestSSHGetExeAndArgsSsh(t *testing.T) {
  function TestSSHGetExeAndArgsSshCustomPort (line 54) | func TestSSHGetExeAndArgsSshCustomPort(t *testing.T) {
  function TestSSHGetExeAndArgsSshNoMultiplexing (line 71) | func TestSSHGetExeAndArgsSshNoMultiplexing(t *testing.T) {
  function TestSSHGetExeAndArgsSshMultiplexingMaster (line 91) | func TestSSHGetExeAndArgsSshMultiplexingMaster(t *testing.T) {
  function TestSSHGetExeAndArgsSshMultiplexingExtra (line 114) | func TestSSHGetExeAndArgsSshMultiplexingExtra(t *testing.T) {
  function TestSSHGetExeAndArgsPlink (line 134) | func TestSSHGetExeAndArgsPlink(t *testing.T) {
  function TestSSHGetExeAndArgsPlinkCustomPort (line 152) | func TestSSHGetExeAndArgsPlinkCustomPort(t *testing.T) {
  function TestSSHGetExeAndArgsPlinkCustomPortExplicitEnvironment (line 171) | func TestSSHGetExeAndArgsPlinkCustomPortExplicitEnvironment(t *testing.T) {
  function TestSSHGetExeAndArgsPlinkCustomPortExplicitEnvironmentPutty (line 191) | func TestSSHGetExeAndArgsPlinkCustomPortExplicitEnvironmentPutty(t *test...
  function TestSSHGetExeAndArgsPlinkCustomPortExplicitEnvironmentSsh (line 211) | func TestSSHGetExeAndArgsPlinkCustomPortExplicitEnvironmentSsh(t *testin...
  function TestSSHGetExeAndArgsTortoisePlink (line 231) | func TestSSHGetExeAndArgsTortoisePlink(t *testing.T) {
  function TestSSHGetExeAndArgsTortoisePlinkCustomPort (line 249) | func TestSSHGetExeAndArgsTortoisePlinkCustomPort(t *testing.T) {
  function TestSSHGetExeAndArgsTortoisePlinkCustomPortExplicitEnvironment (line 268) | func TestSSHGetExeAndArgsTortoisePlinkCustomPortExplicitEnvironment(t *t...
  function TestSSHGetExeAndArgsTortoisePlinkCustomPortExplicitConfig (line 288) | func TestSSHGetExeAndArgsTortoisePlinkCustomPortExplicitConfig(t *testin...
  function TestSSHGetExeAndArgsTortoisePlinkCustomPortExplicitConfigOverride (line 310) | func TestSSHGetExeAndArgsTortoisePlinkCustomPortExplicitConfigOverride(t...
  function TestSSHGetExeAndArgsSshCommandPrecedence (line 331) | func TestSSHGetExeAndArgsSshCommandPrecedence(t *testing.T) {
  function TestSSHGetExeAndArgsSshCommandArgs (line 348) | func TestSSHGetExeAndArgsSshCommandArgs(t *testing.T) {
  function TestSSHGetExeAndArgsSshCommandArgsWithMixedQuotes (line 364) | func TestSSHGetExeAndArgsSshCommandArgsWithMixedQuotes(t *testing.T) {
  function TestSSHGetExeAndArgsSshCommandCustomPort (line 380) | func TestSSHGetExeAndArgsSshCommandCustomPort(t *testing.T) {
  function TestSSHGetExeAndArgsCoreSshCommand (line 396) | func TestSSHGetExeAndArgsCoreSshCommand(t *testing.T) {
  function TestSSHGetExeAndArgsCoreSshCommandArgsWithMixedQuotes (line 413) | func TestSSHGetExeAndArgsCoreSshCommandArgsWithMixedQuotes(t *testing.T) {
  function TestSSHGetExeAndArgsConfigVersusEnv (line 428) | func TestSSHGetExeAndArgsConfigVersusEnv(t *testing.T) {
  function TestSSHGetExeAndArgsPlinkCommand (line 443) | func TestSSHGetExeAndArgsPlinkCommand(t *testing.T) {
  function TestSSHGetExeAndArgsPlinkCommandCustomPort (line 460) | func TestSSHGetExeAndArgsPlinkCommandCustomPort(t *testing.T) {
  function TestSSHGetExeAndArgsTortoisePlinkCommand (line 478) | func TestSSHGetExeAndArgsTortoisePlinkCommand(t *testing.T) {
  function TestSSHGetExeAndArgsTortoisePlinkCommandCustomPort (line 495) | func TestSSHGetExeAndArgsTortoisePlinkCommandCustomPort(t *testing.T) {
  function TestSSHGetLFSExeAndArgsWithCustomSSH (line 513) | func TestSSHGetLFSExeAndArgsWithCustomSSH(t *testing.T) {
  function TestSSHGetLFSExeAndArgsInvalidOptionsAsHost (line 534) | func TestSSHGetLFSExeAndArgsInvalidOptionsAsHost(t *testing.T) {
  function TestSSHGetLFSExeAndArgsInvalidOptionsAsHostWithCustomSSH (line 552) | func TestSSHGetLFSExeAndArgsInvalidOptionsAsHostWithCustomSSH(t *testing...
  function TestSSHGetExeAndArgsInvalidOptionsAsHost (line 573) | func TestSSHGetExeAndArgsInvalidOptionsAsHost(t *testing.T) {
  function TestSSHGetExeAndArgsInvalidOptionsAsPath (line 592) | func TestSSHGetExeAndArgsInvalidOptionsAsPath(t *testing.T) {
  function TestParseBareSSHUrl (line 611) | func TestParseBareSSHUrl(t *testing.T) {

FILE: subprocess/buffered_cmd.go
  constant stdoutBufSize (line 10) | stdoutBufSize = 16384
  type BufferedCmd (line 13) | type BufferedCmd struct

FILE: subprocess/cmd.go
  type Cmd (line 11) | type Cmd struct
    method Run (line 17) | func (c *Cmd) Run() error {
    method Start (line 22) | func (c *Cmd) Start() error {
    method Output (line 27) | func (c *Cmd) Output() ([]byte, error) {
    method CombinedOutput (line 32) | func (c *Cmd) CombinedOutput() ([]byte, error) {
    method StdoutPipe (line 37) | func (c *Cmd) StdoutPipe() (io.ReadCloser, error) {
    method StderrPipe (line 43) | func (c *Cmd) StderrPipe() (io.ReadCloser, error) {
    method StdinPipe (line 49) | func (c *Cmd) StdinPipe() (io.WriteCloser, error) {
    method Wait (line 55) | func (c *Cmd) Wait() error {
    method trace (line 63) | func (c *Cmd) trace() {
  function newCmd (line 71) | func newCmd(cmd *exec.Cmd) *Cmd {

FILE: subprocess/path.go
  function LookPath (line 43) | func LookPath(file string) (string, error) {

FILE: subprocess/path_nix.go
  function findPathExtensions (line 38) | func findPathExtensions() []string {
  function findExecutable (line 42) | func findExecutable(file string, exts []string) (string, error) {

FILE: subprocess/path_windows.go
  function chkStat (line 39) | func chkStat(file string) error {
  function hasExt (line 50) | func hasExt(file string) bool {
  function findExecutable (line 58) | func findExecutable(file string, exts []string) (string, error) {
  function findPathExtensions (line 75) | func findPathExtensions() []string {

FILE: subprocess/subprocess.go
  function BufferedExec (line 22) | func BufferedExec(name string, args ...string) (*BufferedCmd, error) {
  function StdoutBufferedExec (line 56) | func StdoutBufferedExec(name string, args ...string) (*BufferedCmd, erro...
  function SimpleExec (line 84) | func SimpleExec(name string, args ...string) (string, error) {
  function Output (line 92) | func Output(cmd *Cmd) (string, error) {
  function ShellQuoteSingle (line 119) | func ShellQuoteSingle(str string) string {
  function ShellQuote (line 129) | func ShellQuote(strs []string) []string {
  function FormatForShell (line 142) | func FormatForShell(name string, args string) (string, []string) {
  function FormatForShellQuotedArgs (line 149) | func FormatForShellQuotedArgs(name string, args []string) (string, []str...
  function FormatPercentSequences (line 153) | func FormatPercentSequences(pattern string, replacements map[string]stri...
  function Trace (line 174) | func Trace(name string, args ...string) {
  function quotedArgs (line 178) | func quotedArgs(args []string) string {
  function fetchEnvironment (line 203) | func fetchEnvironment() []string {
  function fetchEnvironmentInternal (line 212) | func fetchEnvironmentInternal() []string {
  function ResetEnvironment (line 231) | func ResetEnvironment() {

FILE: subprocess/subprocess_nix.go
  function ExecCommand (line 11) | func ExecCommand(name string, arg ...string) (*Cmd, error) {

FILE: subprocess/subprocess_test.go
  type ShellQuoteTestCase (line 9) | type ShellQuoteTestCase struct
    method Assert (line 14) | func (c *ShellQuoteTestCase) Assert(t *testing.T) {
  function TestShellQuote (line 23) | func TestShellQuote(t *testing.T) {
  type FormatForShellQuotedArgsTestCase (line 37) | type FormatForShellQuotedArgsTestCase struct
    method Assert (line 43) | func (c *FormatForShellQuotedArgsTestCase) Assert(t *testing.T) {
  function TestFormatForShellQuotedArgs (line 55) | func TestFormatForShellQuotedArgs(t *testing.T) {
  type FormatForShellTestCase (line 65) | type FormatForShellTestCase struct
    method Assert (line 71) | func (c *FormatForShellTestCase) Assert(t *testing.T) {
  function TestFormatForShell (line 83) | func TestFormatForShell(t *testing.T) {
  type FormatPercentSequencesTestCase (line 93) | type FormatPercentSequencesTestCase struct
    method Assert (line 99) | func (c *FormatPercentSequencesTestCase) Assert(t *testing.T) {
  function TestFormatPercentSequences (line 108) | func TestFormatPercentSequences(t *testing.T) {

FILE: subprocess/subprocess_windows.go
  function ExecCommand (line 12) | func ExecCommand(name string, arg ...string) (*Cmd, error) {

FILE: t/cmd/git-credential-lfsnoop.go
  function main (line 6) | func main() {

FILE: t/cmd/git-credential-lfstest.go
  type credential (line 27) | type credential struct
    method Serialize (line 38) | func (c *credential) Serialize(capabilities map[string]struct{}, state...
  function init (line 64) | func init() {
  function main (line 70) | func main() {
  function fill (line 87) | func fill() {
  function discoverCapabilities (line 156) | func discoverCapabilities(creds map[string][]string) map[string]struct{} {
  function credsForHostAndPath (line 171) | func credsForHostAndPath(host, path string) ([]credential, error) {
  function parseOneCredential (line 200) | func parseOneCredential(s, file string) (credential, error) {
  function credsFromFilename (line 236) | func credsFromFilename(file string) ([]credential, error) {
  function log (line 253) | func log() {
  function firstEntryForKey (line 257) | func firstEntryForKey(input map[string][]string, key string) string {

FILE: t/cmd/lfs-askpass.go
  function main (line 12) | func main() {

FILE: t/cmd/lfs-ssh-echo.go
  type sshResponse (line 17) | type sshResponse struct
  function shell (line 24) | func shell() string {
  function spawnCommand (line 31) | func spawnCommand(command string) error {
  function checkSufficientArgs (line 47) | func checkSufficientArgs(offset int) {
  function main (line 54) | func main() {

FILE: t/cmd/lfs-ssh-proxy-test.go
  function main (line 8) | func main() {

FILE: t/cmd/lfstest-badpathcheck.go
  function main (line 11) | func main() {

FILE: t/cmd/lfstest-caseinverterextension.go
  function main (line 21) | func main() {
  function openLog (line 72) | func openLog() *os.File {
  function logErrorAndExit (line 86) | func logErrorAndExit(log *os.File, format string, vals ...interface{}) {

FILE: t/cmd/lfstest-count-tests.go
  type countFn (line 49) | type countFn
  function main (line 51) | func main() {
  function acquire (line 172) | func acquire(ctx context.Context) error {
  function release (line 203) | func release() error {
  function callWithCount (line 215) | func callWithCount(fn countFn) error {
  function path (line 266) | func path(s string) (string, error) {
  function fatal (line 276) | func fatal(err error) {

FILE: t/cmd/lfstest-customadapter.go
  function main (line 28) | func main() {
  function writeToStderr (line 65) | func writeToStderr(msg string, errWriter *bufio.Writer) {
  function sendResponse (line 73) | func sendResponse(r interface{}, writer, errWriter *bufio.Writer) error {
  function sendTransferError (line 89) | func sendTransferError(oid string, code int, message string, writer, err...
  function sendProgress (line 97) | func sendProgress(oid string, bytesSoFar int64, bytesSinceLast int, writ...
  function performDownload (line 105) | func performDownload(apiClient *lfsapi.Client, oid string, size int64, a...
  function performUpload (line 161) | func performUpload(apiClient *lfsapi.Client, oid string, size int64, a *...
  type header (line 226) | type header struct
  type action (line 230) | type action struct
  type transferError (line 235) | type transferError struct
  type request (line 241) | type request struct
  type initResponse (line 252) | type initResponse struct
  type transferResponse (line 255) | type transferResponse struct
  type progressResponse (line 261) | type progressResponse struct

FILE: t/cmd/lfstest-genrandom.go
  constant usageFmt (line 15) | usageFmt = "Usage: %s [--base64|--base64url] [<size>]\n"
  function main (line 17) | func main() {

FILE: t/cmd/lfstest-gitserver.go
  function main (line 71) | func main() {
  function writeTestStateFile (line 170) | func writeTestStateFile(contents []byte, envVar, defaultFilename string)...
  type lfsObject (line 184) | type lfsObject struct
  type lfsLink (line 193) | type lfsLink struct
  type lfsError (line 200) | type lfsError struct
  function writeLFSError (line 205) | func writeLFSError(w http.ResponseWriter, code int, msg string) {
  function lfsHandler (line 218) | func lfsHandler(w http.ResponseWriter, r *http.Request, id string) {
  function lfsUrl (line 261) | func lfsUrl(repo, oid string, redirect bool) string {
  constant secondsToRefillTokens (line 270) | secondsToRefillTokens = 10
  constant refillTokenCount (line 271) | refillTokenCount      = 5
  function getResourceKey (line 280) | func getResourceKey(api, direction, repo, oid string) string {
  function checkRateLimit (line 287) | func checkRateLimit(api, direction, repo, oid string) (seconds int, isWa...
  function setRateLimit (line 318) | func setRateLimit(api, direction, repo, oid string, numTokens int) {
  function incrementRetriesFor (line 336) | func incrementRetriesFor(api, direction, repo, oid string, check bool) (...
  function lfsDeleteHandler (line 361) | func lfsDeleteHandler(w http.ResponseWriter, r *http.Request, id, repo s...
  type batchReq (line 370) | type batchReq struct
    method RefName (line 377) | func (r *batchReq) RefName() string {
  type batchResp (line 384) | type batchResp struct
  function lfsBatchHandler (line 390) | func lfsBatchHandler(w http.ResponseWriter, r *http.Request, id, repo st...
  function serveExpired (line 607) | func serveExpired(a *lfsLink, repo, handler string) *lfsLink {
  function canServeExpired (line 640) | func canServeExpired(repo string) bool {
  function verifyHandler (line 657) | func verifyHandler(w http.ResponseWriter, r *http.Request) {
  function storageHandler (line 692) | func storageHandler(w http.ResponseWriter, r *http.Request) {
  function validateTusHeaders (line 996) | func validateTusHeaders(r *http.Request, id string) bool {
  function gitHandler (line 1004) | func gitHandler(w http.ResponseWriter, r *http.Request) {
  function redirect307Handler (line 1052) | func redirect307Handler(w http.ResponseWriter, r *http.Request) {
  function limitsHandler (line 1079) | func limitsHandler(w http.ResponseWriter, r *http.Request) {
  type User (line 1104) | type User struct
  type Lock (line 1108) | type Lock struct
  type LockRequest (line 1115) | type LockRequest struct
    method RefName (line 1120) | func (r *LockRequest) RefName() string {
  type LockResponse (line 1127) | type LockResponse struct
  type UnlockRequest (line 1132) | type UnlockRequest struct
    method RefName (line 1137) | func (r *UnlockRequest) RefName() string {
  type UnlockResponse (line 1144) | type UnlockResponse struct
  type LockList (line 1149) | type LockList struct
  type Ref (line 1155) | type Ref struct
  type VerifiableLockRequest (line 1159) | type VerifiableLockRequest struct
    method RefName (line 1165) | func (r *VerifiableLockRequest) RefName() string {
  type VerifiableLockList (line 1172) | type VerifiableLockList struct
  function addLocks (line 1184) | func addLocks(repo string, l ...Lock) {
  function getLocks (line 1191) | func getLocks(repo string) []Lock {
  function getFilteredLocks (line 1204) | func getFilteredLocks(repo, path, cursor, limit string) ([]Lock, string,...
  function delLock (line 1252) | func delLock(repo string, id string) *Lock {
  type LocksByCreatedAt (line 1269) | type LocksByCreatedAt
    method Len (line 1271) | func (c LocksByCreatedAt) Len() int           { return len(c) }
    method Less (line 1272) | func (c LocksByCreatedAt) Less(i, j int) bool { return c[i].LockedAt.B...
    method Swap (line 1273) | func (c LocksByCreatedAt) Swap(i, j int)      { c[i], c[j] = c[j], c[i] }
  function locksHandler (line 1280) | func locksHandler(w http.ResponseWriter, r *http.Request, repo string) {
  function missingRequiredCreds (line 1490) | func missingRequiredCreds(w http.ResponseWriter, r *http.Request, repo s...
  function testingChunkedTransferEncoding (line 1515) | func testingChunkedTransferEncoding(r *http.Request) bool {
  function testingTusUploadInBatchReq (line 1519) | func testingTusUploadInBatchReq(r *http.Request) bool {
  function testingTusUploadInterruptedInBatchReq (line 1522) | func testingTusUploadInterruptedInBatchReq(r *http.Request) bool {
  function testingCustomTransfer (line 1525) | func testingCustomTransfer(r *http.Request) bool {
  function repoFromLfsUrl (line 1531) | func repoFromLfsUrl(urlpath string) (string, error) {
  type lfsStorage (line 1544) | type lfsStorage struct
    method Get (line 1550) | func (s *lfsStorage) Get(repo, oid string) ([]byte, bool) {
    method Has (line 1562) | func (s *lfsStorage) Has(repo, oid string) bool {
    method Set (line 1574) | func (s *lfsStorage) Set(repo, oid string, by []byte) {
    method Delete (line 1585) | func (s *lfsStorage) Delete(repo, oid string) {
    method GetIncomplete (line 1594) | func (s *lfsStorage) GetIncomplete(repo, oid string) ([]byte, bool) {
    method SetIncomplete (line 1606) | func (s *lfsStorage) SetIncomplete(repo, oid string, by []byte) {
    method DeleteIncomplete (line 1617) | func (s *lfsStorage) DeleteIncomplete(repo, oid string) {
  function newLfsStorage (line 1626) | func newLfsStorage() *lfsStorage {
  function extractAuth (line 1634) | func extractAuth(auth string) (string, string, string, error) {
  function skipIfNoCookie (line 1656) | func skipIfNoCookie(w http.ResponseWriter, r *http.Request, id string) b...
  function skipIfBadAuth (line 1667) | func skipIfBadAuth(w http.ResponseWriter, r *http.Request, id string) bo...
  function init (line 1736) | func init() {
  function debug (line 1745) | func debug(reqid, msg string, args ...interface{}) {
  function reqId (line 1754) | func reqId(w http.ResponseWriter) (string, bool) {
  function generateCARootCertificates (line 1765) | func generateCARootCertificates() (rootKey *rsa.PrivateKey, rootCert *x5...
  function generateClientCertificates (line 1788) | func generateClientCertificates(rootCert *x509.Certificate, rootKey inte...
  function CertTemplate (line 1841) | func CertTemplate() (*x509.Certificate, error) {
  function CreateCert (line 1860) | func CreateCert(template, parent *x509.Certificate, pub interface{}, par...

FILE: t/cmd/lfstest-nanomtime.go
  function main (line 11) | func main() {

FILE: t/cmd/lfstest-realpath.go
  function canonicalize (line 12) | func canonicalize(path string) (string, error) {
  function main (line 43) | func main() {

FILE: t/cmd/lfstest-standalonecustomadapter.go
  function main (line 21) | func main() {
  function writeToStderr (line 62) | func writeToStderr(msg string, errWriter *bufio.Writer) {
  function sendResponse (line 70) | func sendResponse(r interface{}, writer, errWriter *bufio.Writer) error {
  function sendTransferError (line 86) | func sendTransferError(oid string, code int, message string, writer, err...
  function sendProgress (line 94) | func sendProgress(oid string, bytesSoFar int64, bytesSinceLast int, writ...
  function performCopy (line 102) | func performCopy(oid, src, dst string, size int64, writer, errWriter *bu...
  function performDownload (line 137) | func performDownload(oid string, size int64, writer, errWriter *bufio.Wr...
  function performUpload (line 160) | func performUpload(oid string, size int64, fromPath string, writer, errW...
  type header (line 174) | type header struct
  type action (line 178) | type action struct
  type transferError (line 183) | type transferError struct
  type request (line 189) | type request struct
  type initResponse (line 200) | type initResponse struct
  type transferResponse (line 203) | type transferResponse struct
  type progressResponse (line 209) | type progressResponse struct

FILE: t/cmd/lfstest-testutils.go
  type TestUtilRepoCallback (line 16) | type TestUtilRepoCallback struct
    method Fatalf (line 18) | func (*TestUtilRepoCallback) Fatalf(format string, args ...interface{}) {
    method Errorf (line 22) | func (*TestUtilRepoCallback) Errorf(format string, args ...interface{}) {
  function main (line 26) | func main() {
  function AddCommits (line 59) | func AddCommits(repo *Repo) {

FILE: t/cmd/util/testutils.go
  function init (line 30) | func init() {
  type RepoType (line 58) | type RepoType
  constant RepoTypeNormal (line 62) | RepoTypeNormal = RepoType(iota)
  constant RepoTypeBare (line 64) | RepoTypeBare = RepoType(iota)
  constant RepoTypeSeparateDir (line 66) | RepoTypeSeparateDir = RepoType(iota)
  type RepoCreateSettings (line 75) | type RepoCreateSettings struct
  type RepoCallback (line 80) | type RepoCallback interface
  type Repo (line 87) | type Repo struct
    method Pushd (line 106) | func (r *Repo) Pushd() {
    method Popd (line 121) | func (r *Repo) Popd() {
    method Filesystem (line 131) | func (r *Repo) Filesystem() *fs.Filesystem {
    method Configuration (line 135) | func (r *Repo) Configuration() *config.Configuration {
    method GitConfig (line 139) | func (r *Repo) GitConfig() *git.Configuration {
    method GitEnv (line 143) | func (r *Repo) GitEnv() config.Environment {
    method OSEnv (line 147) | func (r *Repo) OSEnv() config.Environment {
    method Cleanup (line 151) | func (r *Repo) Cleanup() {
    method AddCommits (line 391) | func (repo *Repo) AddCommits(inputs []*CommitInput) []*CommitOutput {
    method AddRemote (line 466) | func (r *Repo) AddRemote(name string) *Repo {
  function NewRepo (line 179) | func NewRepo(callback RepoCallback) *Repo {
  function NewBareRepo (line 187) | func NewBareRepo(callback RepoCallback) *Repo {
  function newRepo (line 194) | func newRepo(callback RepoCallback, settings *RepoCreateSettings) *Repo {
  function WrapRepo (line 245) | func WrapRepo(c RepoCallback, path string) *Repo {
  function RunGitCommand (line 261) | func RunGitCommand(callback RepoCallback, failureCheck bool, args ...str...
  type FileInput (line 271) | type FileInput struct
    method AddToIndex (line 282) | func (infile *FileInput) AddToIndex(output *CommitOutput, repo *Repo) {
    method writeLFSPointer (line 293) | func (infile *FileInput) writeLFSPointer(repo *Repo, inputData io.Read...
    method getFileInputReader (line 327) | func (infile *FileInput) getFileInputReader() io.Reader {
  type CommitInput (line 341) | type CommitInput struct
  type CommitOutput (line 360) | type CommitOutput struct
  function commitAtDate (line 366) | func commitAtDate(atDate time.Time, committerName, committerEmail, msg s...
  type PlaceholderDataReader (line 480) | type PlaceholderDataReader struct
    method Read (line 489) | func (r *PlaceholderDataReader) Read(p []byte) (int, error) {
  function NewPlaceholderDataReader (line 485) | func NewPlaceholderDataReader(seed, size int64) *PlaceholderDataReader {
  type RefsByName (line 514) | type RefsByName
    method Len (line 516) | func (a RefsByName) Len() int           { return len(a) }
    method Swap (line 517) | func (a RefsByName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
    method Less (line 518) | func (a RefsByName) Less(i, j int) bool { return a[i].Name < a[j].Name }
  type WorktreesByName (line 521) | type WorktreesByName
    method Len (line 523) | func (a WorktreesByName) Len() int           { return len(a) }
    method Swap (line 524) | func (a WorktreesByName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
    method Less (line 525) | func (a WorktreesByName) Less(i, j int) bool { return a[i].Dir < a[j]....
  type WrappedPointersByOid (line 528) | type WrappedPointersByOid
    method Len (line 530) | func (a WrappedPointersByOid) Len() int           { return len(a) }
    method Swap (line 531) | func (a WrappedPointersByOid) Swap(i, j int)      { a[i], a[j] = a[j],...
    method Less (line 532) | func (a WrappedPointersByOid) Less(i, j int) bool { return a[i].Pointe...
  type PointersByOid (line 535) | type PointersByOid
    method Len (line 537) | func (a PointersByOid) Len() int           { return len(a) }
    method Swap (line 538) | func (a PointersByOid) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
    method Less (line 539) | func (a PointersByOid) Less(i, j int) bool { return a[i].Oid < a[j].Oid }

FILE: tasklog/list_task.go
  type ListTask (line 16) | type ListTask struct
    method Entry (line 30) | func (l *ListTask) Entry(update string) {
    method Complete (line 37) | func (l *ListTask) Complete() {
    method Throttled (line 47) | func (l *ListTask) Throttled() bool { return false }
    method Updates (line 51) | func (l *ListTask) Updates() <-chan *Update { return l.ch }
  function NewListTask (line 22) | func NewListTask(msg string) *ListTask {

FILE: tasklog/list_task_test.go
  function TestListTaskCallsDoneWhenComplete (line 9) | func TestListTaskCallsDoneWhenComplete(t *testing.T) {
  function TestListTaskWritesEntries (line 31) | func TestListTaskWritesEntries(t *testing.T) {
  function TestListTaskIsNotThrottled (line 45) | func TestListTaskIsNotThrottled(t *testing.T) {

FILE: tasklog/log.go
  constant DefaultLoggingThrottle (line 16) | DefaultLoggingThrottle = 200 * time.Millisecond
  type Logger (line 21) | type Logger struct
    method Close (line 107) | func (l *Logger) Close() {
    method Waiter (line 118) | func (l *Logger) Waiter(msg string) *WaitingTask {
    method Percentage (line 126) | func (l *Logger) Percentage(msg string, total uint64) *PercentageTask {
    method List (line 134) | func (l *Logger) List(msg string) *ListTask {
    method Simple (line 142) | func (l *Logger) Simple() *SimpleTask {
    method Enqueue (line 150) | func (l *Logger) Enqueue(ts ...Task) {
    method consume (line 179) | func (l *Logger) consume() {
    method logTask (line 215) | func (l *Logger) logTask(task Task) {
    method logLine (line 255) | func (l *Logger) logLine(str string) (n int, err error) {
    method log (line 265) | func (l *Logger) log(str string) (n int, err error) {
  type Option (line 49) | type Option
  function ForceProgress (line 53) | func ForceProgress(v bool) Option {
  function NewLogger (line 62) | func NewLogger(sink io.Writer, options ...Option) *Logger {
  type hasFd (line 93) | type hasFd interface
  function tty (line 98) | func tty(writer io.Writer) bool {

FILE: tasklog/log_test.go
  type ChanTask (line 12) | type ChanTask
    method Updates (line 14) | func (e ChanTask) Updates() <-chan *Update { return e }
    method Throttled (line 16) | func (e ChanTask) Throttled() bool
Condensed preview — 631 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,203K chars).
[
  {
    "path": ".gitattributes",
    "chars": 36,
    "preview": "* text=auto\n* eol=lf\n*.bat eol=crlf\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 18,
    "preview": "*   @git-lfs/core\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 1531,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the b"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/other-issue.md",
    "chars": 1009,
    "preview": "---\nname: Other issue\nabout: Ask a question, request a feature, or report something that's not a bug\ntitle: ''\nlabels: '"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 123,
    "preview": "---\nversion: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"monthl"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 6149,
    "preview": "name: CI\non: [push, pull_request]\nenv:\n  GOTOOLCHAIN: local\n\njobs:\n  build-default:\n    name: Build with default Git\n   "
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 7397,
    "preview": "name: Release\non:\n  push:\n    tags: '*'\nenv:\n  GOTOOLCHAIN: local\n\njobs:\n  build-windows:\n    name: Build Windows Assets"
  },
  {
    "path": ".gitignore",
    "chars": 405,
    "preview": "bin/\nbenchmark/\nout/\nresource.syso\n\nman/*\n\n*.test\ntmp\nt/remote\nt/scutiger\nt/test_count\nt/test_count.lock\n\ndebian/git-lfs"
  },
  {
    "path": ".mailmap",
    "chars": 1375,
    "preview": "Andy Neff <andyneff@users.noreply.github.com> <andrew.neff@visionsystemsinc.com>\nArtem V. Navrotskiy <bozaro@yandex.ru> "
  },
  {
    "path": ".ruby-version",
    "chars": 6,
    "preview": "3.1.2\n"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 125916,
    "preview": "# Git LFS Changelog\n\n## 3.7.0 (26 June 2025)\n\nThis release is a feature release which introduces several new options\nfor"
  },
  {
    "path": "CODE-OF-CONDUCT.md",
    "chars": 7287,
    "preview": "# Git LFS Code of Conduct\n\nThis code of conduct outlines our expectations for participants within the Git LFS community,"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 7775,
    "preview": "## Contributing to Git Large File Storage\n\nHi there! We're thrilled that you'd like to contribute to this project. Your\n"
  },
  {
    "path": "INSTALLING.md",
    "chars": 3066,
    "preview": "# Installing on Linux using packagecloud\n\n[packagecloud](https://packagecloud.io) hosts [`git-lfs` packages](https://pac"
  },
  {
    "path": "LICENSE.md",
    "chars": 2818,
    "preview": "MIT License\n\nCopyright (c) 2014- GitHub, Inc. and Git LFS contributors\n\nPermission is hereby granted, free of charge, to"
  },
  {
    "path": "Makefile",
    "chars": 28962,
    "preview": "# GIT_LFS_SHA is the '--short'-form SHA1 of the current revision of Git LFS.\nGIT_LFS_SHA ?= $(shell env -u GIT_TRACE git"
  },
  {
    "path": "README.md",
    "chars": 10700,
    "preview": "# Git Large File Storage\n\n[![CI status][ci_badge]][ci_url]\n\n[ci_badge]: https://github.com/git-lfs/git-lfs/workflows/CI/"
  },
  {
    "path": "SECURITY.md",
    "chars": 2912,
    "preview": "## Security\n\nGit LFS is a public, open-source project supported by GitHub and a\nbroad community of other organizations a"
  },
  {
    "path": "commands/command_checkout.go",
    "chars": 5877,
    "preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"github.com/git-lfs/g"
  },
  {
    "path": "commands/command_clean.go",
    "chars": 3284,
    "preview": "package commands\n\nimport (\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"github.com/git-lfs/git-lfs/v3/lfs\"\n\t\"g"
  },
  {
    "path": "commands/command_clone.go",
    "chars": 7047,
    "preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/git-lfs/git-lfs/v3/subprocess\""
  },
  {
    "path": "commands/command_dedup.go",
    "chars": 4389,
    "preview": "package commands\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync/atomic\"\n\n\t\"github.com/git-lfs/git-lfs/v3/config\"\n\t\"github.com/g"
  },
  {
    "path": "commands/command_env.go",
    "chars": 1718,
    "preview": "package commands\n\nimport (\n\t\"github.com/git-lfs/git-lfs/v3/config\"\n\t\"github.com/git-lfs/git-lfs/v3/git\"\n\t\"github.com/git"
  },
  {
    "path": "commands/command_ext.go",
    "chars": 896,
    "preview": "package commands\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/git-lfs/git-lfs/v3/config\"\n\t\"github.com/git-lfs/git-lfs/v3/tr\"\n\t\"github."
  },
  {
    "path": "commands/command_fetch.go",
    "chars": 13855,
    "preview": "package commands\n\nimport (\n\t\"bufio\"\n\t\"encoding/json\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"gi"
  },
  {
    "path": "commands/command_filter_process.go",
    "chars": 11884,
    "preview": "package commands\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"git"
  },
  {
    "path": "commands/command_fsck.go",
    "chars": 6363,
    "preview": "package commands\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com"
  },
  {
    "path": "commands/command_install.go",
    "chars": 3531,
    "preview": "package commands\n\nimport (\n\t\"os\"\n\n\t\"github.com/git-lfs/git-lfs/v3/git\"\n\t\"github.com/git-lfs/git-lfs/v3/lfs\"\n\t\"github.com"
  },
  {
    "path": "commands/command_lock.go",
    "chars": 3578,
    "preview": "package commands\n\nimport (\n\t\"encoding/json\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t"
  },
  {
    "path": "commands/command_locks.go",
    "chars": 5587,
    "preview": "package commands\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"github.com/git-lfs/"
  },
  {
    "path": "commands/command_logs.go",
    "chars": 1910,
    "preview": "package commands\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"github.com/git-lfs/git-lfs/"
  },
  {
    "path": "commands/command_ls_files.go",
    "chars": 5540,
    "preview": "package commands\n\nimport (\n\t\"encoding/json\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t"
  },
  {
    "path": "commands/command_merge_driver.go",
    "chars": 4586,
    "preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"github.com/git-lfs/git-lfs"
  },
  {
    "path": "commands/command_migrate.go",
    "chars": 13319,
    "preview": "package commands\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"github.com/git-lf"
  },
  {
    "path": "commands/command_migrate_export.go",
    "chars": 5427,
    "preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"github.com/git-lfs/g"
  },
  {
    "path": "commands/command_migrate_import.go",
    "chars": 12705,
    "preview": "package commands\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/git-"
  },
  {
    "path": "commands/command_migrate_info.go",
    "chars": 10004,
    "preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/git-lfs/git-lfs/v3/error"
  },
  {
    "path": "commands/command_pointer.go",
    "chars": 5346,
    "preview": "package commands\n\nimport (\n\t\"bytes\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/git-lfs/"
  },
  {
    "path": "commands/command_post_checkout.go",
    "chars": 2691,
    "preview": "package commands\n\nimport (\n\t\"os\"\n\n\t\"github.com/git-lfs/git-lfs/v3/git\"\n\t\"github.com/git-lfs/git-lfs/v3/locking\"\n\t\"github"
  },
  {
    "path": "commands/command_post_commit.go",
    "chars": 1614,
    "preview": "package commands\n\nimport (\n\t\"os\"\n\n\t\"github.com/git-lfs/git-lfs/v3/git\"\n\t\"github.com/git-lfs/git-lfs/v3/tr\"\n\t\"github.com/"
  },
  {
    "path": "commands/command_post_merge.go",
    "chars": 1537,
    "preview": "package commands\n\nimport (\n\t\"os\"\n\n\t\"github.com/git-lfs/git-lfs/v3/tr\"\n\t\"github.com/rubyist/tracerx\"\n\t\"github.com/spf13/c"
  },
  {
    "path": "commands/command_pre_push.go",
    "chars": 3170,
    "preview": "package commands\n\nimport (\n\t\"bufio\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/git-lfs/git-lfs/v3/git\"\n\t\"github.com/git-lfs/gi"
  },
  {
    "path": "commands/command_prune.go",
    "chars": 20175,
    "preview": "package commands\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/git-lfs/git-lfs/v3/"
  },
  {
    "path": "commands/command_pull.go",
    "chars": 3790,
    "preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/git-lfs/git-lfs/v3/filepathfilter\"\n\t\"github.com/gi"
  },
  {
    "path": "commands/command_push.go",
    "chars": 4992,
    "preview": "package commands\n\nimport (\n\t\"bufio\"\n\t\"os\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"github.com/git-lfs/git-lfs/v3/git\"\n"
  },
  {
    "path": "commands/command_smudge.go",
    "chars": 5779,
    "preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"github.com/git-lfs/git-lfs/v3/f"
  },
  {
    "path": "commands/command_standalone_file.go",
    "chars": 408,
    "preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/git-lfs/git-lfs/v3/lfshttp/standalone\"\n\t\"github.com/spf13/cobra\"\n)"
  },
  {
    "path": "commands/command_status.go",
    "chars": 8337,
    "preview": "package commands\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.co"
  },
  {
    "path": "commands/command_track.go",
    "chars": 12168,
    "preview": "package commands\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strings"
  },
  {
    "path": "commands/command_uninstall.go",
    "chars": 1835,
    "preview": "package commands\n\nimport (\n\t\"github.com/git-lfs/git-lfs/v3/git\"\n\t\"github.com/git-lfs/git-lfs/v3/tr\"\n\t\"github.com/spf13/c"
  },
  {
    "path": "commands/command_unlock.go",
    "chars": 5217,
    "preview": "package commands\n\nimport (\n\t\"encoding/json\"\n\t\"os\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"github.com/git-lfs/git-lfs/"
  },
  {
    "path": "commands/command_untrack.go",
    "chars": 1622,
    "preview": "package commands\n\nimport (\n\t\"bufio\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/git-lfs/git-lfs/v3/tools\"\n\t\"github.com/git-lfs/git-lf"
  },
  {
    "path": "commands/command_update.go",
    "chars": 1674,
    "preview": "package commands\n\nimport (\n\t\"regexp\"\n\n\t\"github.com/git-lfs/git-lfs/v3/tr\"\n\t\"github.com/spf13/cobra\"\n)\n\nvar (\n\tupdateForc"
  },
  {
    "path": "commands/command_version.go",
    "chars": 467,
    "preview": "package commands\n\nimport (\n\t\"github.com/git-lfs/git-lfs/v3/lfshttp\"\n\t\"github.com/spf13/cobra\"\n)\n\nvar (\n\tlovesComics bool"
  },
  {
    "path": "commands/commands.go",
    "chars": 14938,
    "preview": "package commands\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\""
  },
  {
    "path": "commands/commands_test.go",
    "chars": 1553,
    "preview": "package commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/git-lfs/git-lfs/v3/config\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\n"
  },
  {
    "path": "commands/lockverifier.go",
    "chars": 6460,
    "preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/git-lfs/git-lfs/v3/config\"\n\t\"github.com/gi"
  },
  {
    "path": "commands/multiwriter.go",
    "chars": 425,
    "preview": "package commands\n\nimport (\n\t\"io\"\n\t\"os\"\n)\n\ntype multiWriter struct {\n\twriter io.Writer\n\tfd     uintptr\n}\n\nfunc newMultiWr"
  },
  {
    "path": "commands/path.go",
    "chars": 275,
    "preview": "package commands\n\nimport \"strings\"\n\nfunc gitLineEnding(git env) string {\n\tvalue, _ := git.Get(\"core.autocrlf\")\n\tswitch s"
  },
  {
    "path": "commands/path_nix.go",
    "chars": 226,
    "preview": "//go:build !windows\n// +build !windows\n\npackage commands\n\n// cleanRootPath is a no-op on every platform except Windows\nf"
  },
  {
    "path": "commands/path_windows.go",
    "chars": 1450,
    "preview": "//go:build windows\n// +build windows\n\npackage commands\n\nimport (\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github"
  },
  {
    "path": "commands/pointers.go",
    "chars": 299,
    "preview": "package commands\n\nimport \"github.com/git-lfs/git-lfs/v3/lfs\"\n\nfunc collectPointers(pointerCh *lfs.PointerChannelWrapper)"
  },
  {
    "path": "commands/pull.go",
    "chars": 6079,
    "preview": "package commands\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/git-lfs/git-lfs/v3/config\"\n\t\"github.com"
  },
  {
    "path": "commands/run.go",
    "chars": 5970,
    "preview": "package commands\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/git-lf"
  },
  {
    "path": "commands/uploader.go",
    "chars": 10570,
    "preview": "package commands\n\nimport (\n\t\"io\"\n\t\"net/url\"\n\t\"os\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"github.c"
  },
  {
    "path": "commands/uploader_test.go",
    "chars": 1145,
    "preview": "package commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\ntype LockingSupportTestCase struct {\n\tGi"
  },
  {
    "path": "config/config.go",
    "chars": 18140,
    "preview": "// Package config collects together all configuration settings\n// NOTE: Subject to change, do not rely on this package f"
  },
  {
    "path": "config/config_test.go",
    "chars": 9628,
    "preview": "package config\n\nimport (\n\t\"os\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/git-lfs/git-lfs/v3/git\"\n\t\"github.com/stretchr/testify/as"
  },
  {
    "path": "config/delayed_environment.go",
    "chars": 2011,
    "preview": "package config\n\nimport (\n\t\"sync\"\n)\n\n// delayedEnvironment is an implementation of the Environment which wraps the legacy"
  },
  {
    "path": "config/environment.go",
    "chars": 4648,
    "preview": "package config\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n)\n\n// An Environment adds additional behavior to a Fetcher, such a type c"
  },
  {
    "path": "config/environment_test.go",
    "chars": 2381,
    "preview": "package config_test\n\nimport (\n\t\"testing\"\n\n\t. \"github.com/git-lfs/git-lfs/v3/config\"\n\t\"github.com/stretchr/testify/assert"
  },
  {
    "path": "config/extension.go",
    "chars": 887,
    "preview": "package config\n\nimport (\n\t\"errors\"\n\t\"sort\"\n\n\t\"github.com/git-lfs/git-lfs/v3/tr\"\n)\n\n// An Extension describes how to mani"
  },
  {
    "path": "config/extension_test.go",
    "chars": 1041,
    "preview": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestSortExtensions(t *testing.T) {\n\tm"
  },
  {
    "path": "config/fetcher.go",
    "chars": 759,
    "preview": "package config\n\n// Fetcher provides an interface to get typed information out of a configuration\n// \"source\". These sour"
  },
  {
    "path": "config/git_fetcher.go",
    "chars": 4750,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/git-lfs/git-lfs/v3/git\"\n\t\"github.com/g"
  },
  {
    "path": "config/git_fetcher_test.go",
    "chars": 1091,
    "preview": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestGetCanonicalization(t *testing.T)"
  },
  {
    "path": "config/map_fetcher.go",
    "chars": 943,
    "preview": "package config\n\n// mapFetcher provides an implementation of the Fetcher interface by wrapping\n// the `map[string]string`"
  },
  {
    "path": "config/os_fetcher.go",
    "chars": 1693,
    "preview": "package config\n\nimport (\n\t\"os\"\n\t\"sync\"\n)\n\n// OsFetcher is an implementation of the Fetcher type for communicating with\n/"
  },
  {
    "path": "config/url_config.go",
    "chars": 6646,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strings\"\n)\n\ntype URLConfig struct {\n\tgit Environment\n}\n\nfunc NewU"
  },
  {
    "path": "config/url_config_test.go",
    "chars": 3352,
    "preview": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestURLConfig(t *testing.T) {\n\tu := N"
  },
  {
    "path": "config/util_nix.go",
    "chars": 242,
    "preview": "//go:build !windows\n// +build !windows\n\npackage config\n\nimport \"syscall\"\n\nfunc umask() int {\n\t// umask(2), which this fu"
  },
  {
    "path": "config/util_windows.go",
    "chars": 229,
    "preview": "//go:build windows\n// +build windows\n\npackage config\n\n// Windows doesn't provide the umask syscall, so return something "
  },
  {
    "path": "config/version.go",
    "chars": 482,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n\t\"strings\"\n)\n\nvar (\n\tGitCommit   string\n\tVersionDesc string\n\tVendor      stri"
  },
  {
    "path": "creds/access.go",
    "chars": 849,
    "preview": "package creds\n\ntype AccessMode string\n\nconst (\n\tNoneAccess      AccessMode = \"none\"\n\tBasicAccess     AccessMode = \"basic"
  },
  {
    "path": "creds/creds.go",
    "chars": 17655,
    "preview": "package creds\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"os\"\n\t\"os/exec\"\n\t\"slices\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/git-lfs/g"
  },
  {
    "path": "creds/creds_test.go",
    "chars": 10199,
    "preview": "package creds\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"slices\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfun"
  },
  {
    "path": "creds/netrc.go",
    "chars": 3911,
    "preview": "package creds\n\nimport (\n\t\"net\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/git-lfs/git-lfs/v3/con"
  },
  {
    "path": "creds/netrc_test.go",
    "chars": 1853,
    "preview": "package creds\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/git-lfs/go-netrc/netrc\"\n)\n\nfunc TestNetrcWithHostAndPort(t *"
  },
  {
    "path": "debian/changelog",
    "chars": 8278,
    "preview": "git-lfs (3.7.0) stable; urgency=low\n\n  * New upstream version\n\n -- Chris Darroch <chrisd8088@github.com>  Thu, 26 Jun 20"
  },
  {
    "path": "debian/compat",
    "chars": 2,
    "preview": "9\n"
  },
  {
    "path": "debian/control",
    "chars": 481,
    "preview": "Source: git-lfs\nSection: vcs\nPriority: optional\nMaintainer: Stephen Gelman <gelman@getbraintree.com>\nBuild-Depends: debh"
  },
  {
    "path": "debian/copyright",
    "chars": 1297,
    "preview": "Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/\nUpstream-Name: git-lfs\nSource: https://github."
  },
  {
    "path": "debian/git-lfs.lintian-overrides",
    "chars": 276,
    "preview": "# Go only produces static binaries so read-only relocations aren't possible\nhardening-no-relro usr/bin/git-lfs\n\n# strip "
  },
  {
    "path": "debian/git-lfs.manpages",
    "chars": 39,
    "preview": "man/man1/*.1\nman/man5/*.5\nman/man7/*.7\n"
  },
  {
    "path": "debian/postinst",
    "chars": 150,
    "preview": "#!/bin/sh\n\n# The --skip-repo option prevents failure if / is a Git repository with existing\n# non-git-lfs hooks.\ngit lfs"
  },
  {
    "path": "debian/prerm",
    "chars": 200,
    "preview": "#!/bin/sh\n\n# The --skip-repo option avoids mutating / if it is a Git repository. (Maybe the\n# user wants to replace this"
  },
  {
    "path": "debian/rules",
    "chars": 2463,
    "preview": "#!/usr/bin/make -f\n\nexport DH_OPTIONS\n\n#dh_golang doesn't do this for you\nifeq ($(DEB_HOST_ARCH), i386)\n\texport GOARCH :"
  },
  {
    "path": "debian/source/format",
    "chars": 13,
    "preview": "3.0 (native)\n"
  },
  {
    "path": "docker/README.md",
    "chars": 4244,
    "preview": "# Git LFS Linux Docker Builds\n\nIn order to build Linux distribution packages of Git LFS in both the\nDebian and RPM packa"
  },
  {
    "path": "docker/run_dockers.bsh",
    "chars": 3198,
    "preview": "#!/usr/bin/env bash\n\n# Usage:\n#  ./run_dockers.bsh                     # Run all the Docker images\n#  ./run_dockers.bsh "
  },
  {
    "path": "docs/README.md",
    "chars": 426,
    "preview": "# Git LFS Documentation\n\n## Reference Manual\n\nEach Git LFS subcommand is documented in the [official man pages](man). An"
  },
  {
    "path": "docs/api/README.md",
    "chars": 902,
    "preview": "# Git LFS API\n\nThe Git LFS client uses an HTTPS server to coordinate fetching and storing\nlarge binary objects separatel"
  },
  {
    "path": "docs/api/authentication.md",
    "chars": 2440,
    "preview": "# Authentication\n\nThe Git LFS API uses HTTP Basic Authentication to authorize requests. Therefore,\nHTTPS is strongly enc"
  },
  {
    "path": "docs/api/basic-transfers.md",
    "chars": 3272,
    "preview": "# Basic Transfer API\n\nThe Basic transfer API is a simple, generic API for directly uploading and\ndownloading LFS objects"
  },
  {
    "path": "docs/api/batch.md",
    "chars": 9805,
    "preview": "# Git LFS Batch API\n\nAdded: v0.6\n\nThe Batch API is used to request the ability to transfer LFS objects with the\nLFS serv"
  },
  {
    "path": "docs/api/locking.md",
    "chars": 14309,
    "preview": "# Git LFS File Locking API\n\nAdded: v2.0\n\nThe File Locking API is used to create, list, and delete locks, as well as\nveri"
  },
  {
    "path": "docs/api/server-discovery.md",
    "chars": 3303,
    "preview": "# Server Discovery\n\nOne of the Git LFS goals is to work with supporting Git remotes with as few\nrequired configuration p"
  },
  {
    "path": "docs/custom-transfers.md",
    "chars": 12932,
    "preview": "# Adding Custom Transfer Agents to LFS\n\n## Introduction\n\nGit LFS supports multiple ways to transfer (upload and download"
  },
  {
    "path": "docs/extensions.md",
    "chars": 9074,
    "preview": "# Extending LFS\n\nTeams who use Git LFS often have custom requirements for how the pointer files\nand blobs should be hand"
  },
  {
    "path": "docs/howto/release-git-lfs.md",
    "chars": 26394,
    "preview": "# Releasing Git LFS\n\nThe core team of Git LFS maintainers publishes releases on a cadence of their\ndetermining.\n\n## Rele"
  },
  {
    "path": "docs/l10n.md",
    "chars": 4640,
    "preview": "# Localization of Git LFS\n\nGit LFS now has support for a localization framework using [Gotext](https://github.com/leonel"
  },
  {
    "path": "docs/man/asciidoctor-extensions/manpage-extension.rb",
    "chars": 1741,
    "preview": "require 'asciidoctor'\nrequire 'asciidoctor/extensions'\nrequire 'asciidoctor/converter/manpage'\n\nmodule GitLFS\n  module D"
  },
  {
    "path": "docs/man/git-lfs-checkout.adoc",
    "chars": 4073,
    "preview": "= git-lfs-checkout(1)\n\n== NAME\n\ngit-lfs-checkout - Update working copy with file content if available\n\n== SYNOPSIS\n\n[sou"
  },
  {
    "path": "docs/man/git-lfs-clean.adoc",
    "chars": 710,
    "preview": "= git-lfs-clean(1)\n\n== NAME\n\ngit-lfs-clean - Git clean filter that converts large files to pointers\n\n== SYNOPSIS\n\n[sourc"
  },
  {
    "path": "docs/man/git-lfs-clone.adoc",
    "chars": 2078,
    "preview": "= git-lfs-clone(1)\n\n== NAME\n\ngit-lfs-clone - Efficiently clone a LFS-enabled repository\n\n== SYNOPSIS\n\n[source,role=synop"
  },
  {
    "path": "docs/man/git-lfs-completion.adoc",
    "chars": 12519,
    "preview": "= git-lfs-completion(1)\n\n== NAME\n\ngit-lfs-completion - Shell tab-completion script generation for Git LFS\n\n== SYNOPSIS\n\n"
  },
  {
    "path": "docs/man/git-lfs-config.adoc",
    "chars": 19083,
    "preview": "= git-lfs-config(5)\n\n== NAME\n\ngit-lfs-config - Configuration options for git-lfs\n\n== CONFIGURATION FILES\n\ngit-lfs reads "
  },
  {
    "path": "docs/man/git-lfs-dedup.adoc",
    "chars": 996,
    "preview": "= git-lfs-dedup(1)\n\n== NAME\n\ngit-lfs-dedup - Deduplicate Git LFS files\n\n== SYNOPSIS\n\n[source,role=synopsis,subs=\"verbati"
  },
  {
    "path": "docs/man/git-lfs-env.adoc",
    "chars": 259,
    "preview": "= git-lfs-env(1)\n\n== NAME\n\ngit-lfs-env - Display the Git LFS environment\n\n== SYNOPSIS\n\n[source,role=synopsis,subs=\"verba"
  },
  {
    "path": "docs/man/git-lfs-ext.adoc",
    "chars": 493,
    "preview": "= git-lfs-ext(1)\n\n== NAME\n\ngit-lfs-ext - View extension details\n\n== SYNOPSIS\n\n[source,role=synopsis,subs=\"verbatim,quote"
  },
  {
    "path": "docs/man/git-lfs-faq.adoc",
    "chars": 15097,
    "preview": "= git-lfs-faq(7)\n\n== NAME\n\ngit-lfs-faq - FAQ for Git LFS\n\n== ENTRIES\n\n[[cat-file-size]]\n=== File Size\n\n[[faq-track-by-si"
  },
  {
    "path": "docs/man/git-lfs-fetch.adoc",
    "chars": 6181,
    "preview": "= git-lfs-fetch(1)\n\n== NAME\n\ngit-lfs-fetch - Download all Git LFS files for a given ref\n\n== SYNOPSIS\n\n[source,role=synop"
  },
  {
    "path": "docs/man/git-lfs-filter-process.adoc",
    "chars": 1780,
    "preview": "= git-lfs-filter-process(1)\n\n== NAME\n\ngit-lfs-filter-process - Git filter process that converts between pointer and actu"
  },
  {
    "path": "docs/man/git-lfs-fsck.adoc",
    "chars": 1409,
    "preview": "= git-lfs-fsck(1)\n\n== NAME\n\ngit-lfs-fsck - Check GIT LFS files for consistency\n\n== SYNOPSIS\n\n[source,role=synopsis,subs="
  },
  {
    "path": "docs/man/git-lfs-install.adoc",
    "chars": 2598,
    "preview": "= git-lfs-install(1)\n\n== NAME\n\ngit-lfs-install - Install Git LFS configuration.\n\n== SYNOPSIS\n\n[source,role=synopsis,subs"
  },
  {
    "path": "docs/man/git-lfs-lock.adoc",
    "chars": 1056,
    "preview": "= git-lfs-lock(1)\n\n== NAME\n\ngit-lfs-lock - Set a file as \"locked\" on the Git LFS server\n\n== SYNOPSIS\n\n[source,role=synop"
  },
  {
    "path": "docs/man/git-lfs-locks.adoc",
    "chars": 1856,
    "preview": "= git-lfs-locks(1)\n\n== NAME\n\ngit-lfs-locks - Lists currently locked files from the Git LFS server.\n\n== SYNOPSIS\n\n[source"
  },
  {
    "path": "docs/man/git-lfs-logs.adoc",
    "chars": 683,
    "preview": "= git-lfs-logs(1)\n\n== NAME\n\ngit-lfs-logs - Show errors from the git-lfs command\n\n== SYNOPSIS\n\n[source,role=synopsis,subs"
  },
  {
    "path": "docs/man/git-lfs-ls-files.adoc",
    "chars": 2002,
    "preview": "= git-lfs-ls-files(1)\n\n== NAME\n\ngit-lfs-ls-files - Show information about Git LFS files in the index and working tree\n\n="
  },
  {
    "path": "docs/man/git-lfs-merge-driver.adoc",
    "chars": 3553,
    "preview": "= git-lfs-merge-driver(1)\n\n== NAME\n\ngit-lfs-merge-driver - Merge text-based LFS files\n\n== SYNOPSIS\n\n[source,role=synopsi"
  },
  {
    "path": "docs/man/git-lfs-migrate.adoc",
    "chars": 23958,
    "preview": "= git-lfs-migrate(1)\n\n== NAME\n\ngit-lfs-migrate - Migrate history to or from Git LFS\n\n== SYNOPSIS\n\n[source,role=synopsis,"
  },
  {
    "path": "docs/man/git-lfs-pointer.adoc",
    "chars": 1537,
    "preview": "= git-lfs-pointer(1)\n\n== NAME\n\ngit-lfs-pointer - Build, compare, and check pointers\n\n== SYNOPSIS\n\n[source,role=synopsis,"
  },
  {
    "path": "docs/man/git-lfs-post-checkout.adoc",
    "chars": 513,
    "preview": "= git-lfs-post-checkout(1)\n\n== NAME\n\ngit-lfs-post-checkout - Git post-checkout hook implementation\n\n== SYNOPSIS\n\n[source"
  },
  {
    "path": "docs/man/git-lfs-post-commit.adoc",
    "chars": 775,
    "preview": "= git-lfs-post-commit(1)\n\n== NAME\n\ngit-lfs-post-commit - Git post-commit hook implementation\n\n== SYNOPSIS\n\n[source,role="
  },
  {
    "path": "docs/man/git-lfs-post-merge.adoc",
    "chars": 464,
    "preview": "= git-lfs-post-merge(1)\n\n== NAME\n\ngit-lfs-post-merge - Git post-merge hook implementation\n\n== SYNOPSIS\n\n[source,role=syn"
  },
  {
    "path": "docs/man/git-lfs-pre-push.adoc",
    "chars": 1031,
    "preview": "= git-lfs-pre-push(1)\n\n== NAME\n\ngit-lfs-pre-push - Git pre-push hook implementation\n\n== SYNOPSIS\n\n[source,role=synopsis,"
  },
  {
    "path": "docs/man/git-lfs-prune.adoc",
    "chars": 6838,
    "preview": "= git-lfs-prune(1)\n\n== NAME\n\ngit-lfs-prune - Delete old LFS files from local storage\n\n== SYNOPSIS\n\n[source,role=synopsis"
  },
  {
    "path": "docs/man/git-lfs-pull.adoc",
    "chars": 3418,
    "preview": "= git-lfs-pull(1)\n\n== NAME\n\ngit-lfs-pull - Download all Git LFS files for current ref & checkout\n\n== SYNOPSIS\n\n[source,r"
  },
  {
    "path": "docs/man/git-lfs-push.adoc",
    "chars": 1627,
    "preview": "= git-lfs-push(1)\n\n== NAME\n\ngit-lfs-push - Push queued large files to the Git LFS endpoint\n\n== SYNOPSIS\n\n[source,role=sy"
  },
  {
    "path": "docs/man/git-lfs-smudge.adoc",
    "chars": 1909,
    "preview": "= git-lfs-smudge(1)\n\n== NAME\n\ngit-lfs-smudge - Git smudge filter that converts pointer in blobs to the actual content\n\n="
  },
  {
    "path": "docs/man/git-lfs-standalone-file.adoc",
    "chars": 746,
    "preview": "= git-lfs-standalone-file(1)\n\n== NAME\n\ngit-lfs-standalone-file - Standalone transfer adapter for file URLs\n\n== SYNOPSIS\n"
  },
  {
    "path": "docs/man/git-lfs-status.adoc",
    "chars": 1058,
    "preview": "= git-lfs-status(1)\n\n== NAME\n\ngit-lfs-status - Show the status of Git LFS files in the working tree\n\n== SYNOPSIS\n\n[sourc"
  },
  {
    "path": "docs/man/git-lfs-track.adoc",
    "chars": 2852,
    "preview": "= git-lfs-track(1)\n\n== NAME\n\ngit-lfs-track - View or add Git LFS paths to Git attributes\n\n== SYNOPSIS\n\n[source,role=syno"
  },
  {
    "path": "docs/man/git-lfs-uninstall.adoc",
    "chars": 1626,
    "preview": "= git-lfs-uninstall(1)\n\n== NAME\n\ngit-lfs-uninstall - Remove Git LFS configuration\n\n== SYNOPSIS\n\n[source,role=synopsis,su"
  },
  {
    "path": "docs/man/git-lfs-unlock.adoc",
    "chars": 1028,
    "preview": "= git-lfs-unlock(1)\n\n== NAME\n\ngit-lfs-unlock - Remove \"locked\" setting for a file on the Git LFS server\n\n== SYNOPSIS\n\n[s"
  },
  {
    "path": "docs/man/git-lfs-untrack.adoc",
    "chars": 498,
    "preview": "= git-lfs-untrack(1)\n\n== NAME\n\ngit-lfs-untrack - Remove Git LFS paths from Git Attributes\n\n== SYNOPSIS\n\n[source,role=syn"
  },
  {
    "path": "docs/man/git-lfs-update.adoc",
    "chars": 841,
    "preview": "= git-lfs-update(1)\n\n== NAME\n\ngit-lfs-update - Update Git hooks\n\n== SYNOPSIS\n\n[source,role=synopsis,subs=\"verbatim,quote"
  },
  {
    "path": "docs/man/git-lfs.adoc",
    "chars": 4153,
    "preview": "= git-lfs(1)\n\n== NAME\n\ngit-lfs - Work with large files in Git repositories\n\n== SYNOPSIS\n\n[source,role=synopsis,subs=\"ver"
  },
  {
    "path": "docs/man/mangen.go",
    "chars": 6475,
    "preview": "package main\n\nimport (\n\t\"bufio\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n)\n\nfunc infof(w io.Writ"
  },
  {
    "path": "docs/proposals/README.md",
    "chars": 340,
    "preview": "# Git LFS Proposals\n\nThis directory contains high level proposals for future Git LFS features.\nInclusion here does not g"
  },
  {
    "path": "docs/proposals/locking.md",
    "chars": 18623,
    "preview": "# Locking feature proposal\n\nWe need the ability to lock files to discourage (we can never prevent) parallel\nediting of b"
  },
  {
    "path": "docs/proposals/locking_api.md",
    "chars": 3723,
    "preview": "# Locking API proposal\n\n## POST /locks\n\n| Method  | Accept                         | Content-Type                   | Au"
  },
  {
    "path": "docs/proposals/locking_notes.md",
    "chars": 4396,
    "preview": "# Capture Locking Notes during Locks creation and retrieve same during List Locks.\n\n## Concept\n\nThe git-lfs REST API for"
  },
  {
    "path": "docs/proposals/multipart_transfer_mode.md",
    "chars": 17252,
    "preview": "# Multipart HTTP transfer mode proposal\n\nThis is a proposal for a new transfer mode, designed to support multi-part HTTP"
  },
  {
    "path": "docs/proposals/ntlm.md",
    "chars": 1492,
    "preview": "# NTLM Authentication With Git-Lfs\n\nEnterprise users in a windows ecosystem are frequently required to use integrated au"
  },
  {
    "path": "docs/proposals/ssh_adapter.md",
    "chars": 12729,
    "preview": "# SSH protocol proposal\n\nWe'd like to implement a protocol for Git LFS that uses SSH protocol\nexclusively, avoiding the "
  },
  {
    "path": "docs/proposals/transfer_adapters.md",
    "chars": 4418,
    "preview": "# Transfer adapters for resumable upload / download\n\n## Concept\n\nTo allow the uploading and downloading of LFS content t"
  },
  {
    "path": "docs/spec.md",
    "chars": 6184,
    "preview": "# Git LFS Specification\n\nThis is a general guide for Git LFS clients.  Typically it should be\nimplemented by a command l"
  },
  {
    "path": "errors/context.go",
    "chars": 1106,
    "preview": "package errors\n\ntype withContext interface {\n\tSet(string, interface{})\n\tGet(string) interface{}\n\tDel(string)\n\tContext() "
  },
  {
    "path": "errors/errors.go",
    "chars": 2981,
    "preview": "// Package errors provides common error handling tools\n// NOTE: Subject to change, do not rely on this package from outs"
  },
  {
    "path": "errors/errors_test.go",
    "chars": 1484,
    "preview": "package errors\n\nimport (\n\t\"errors\"\n\t\"testing\"\n)\n\nfunc TestChecksHandleGoErrors(t *testing.T) {\n\terr := errors.New(\"go er"
  },
  {
    "path": "errors/types.go",
    "chars": 11252,
    "preview": "package errors\n\nimport (\n\tgoerrors \"errors\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"os/exec\"\n\t\"strconv\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/git"
  },
  {
    "path": "errors/types_test.go",
    "chars": 839,
    "preview": "package errors_test\n\nimport (\n\t\"net/url\"\n\t\"testing\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"github.com/stretchr/testi"
  },
  {
    "path": "filepathfilter/filepathfilter.go",
    "chars": 5244,
    "preview": "package filepathfilter\n\nimport (\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/git-lfs/git-lfs/v3/tr\"\n\t\"github.com/git-lfs/wildmatch/"
  },
  {
    "path": "filepathfilter/filepathfilter_test.go",
    "chars": 3896,
    "preview": "package filepathfilter\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestPatternMatch(t *testing.T"
  },
  {
    "path": "fs/cleanup.go",
    "chars": 1879,
    "preview": "package fs\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/git-lfs/git-lfs/v3/tools\"\n\t\"github."
  },
  {
    "path": "fs/fs.go",
    "chars": 8433,
    "preview": "package fs\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"str"
  },
  {
    "path": "fs/fs_test.go",
    "chars": 950,
    "preview": "package fs\n\nimport (\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestDecodeNone(t *testing.T) {\n\teva"
  },
  {
    "path": "git/config.go",
    "chars": 7090,
    "preview": "package git\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/git-lfs/git-lfs/v3/subpro"
  },
  {
    "path": "git/config_test.go",
    "chars": 307,
    "preview": "package git_test // to avoid import cycles\n\nimport (\n\t\"testing\"\n\n\t. \"github.com/git-lfs/git-lfs/v3/git\"\n\t\"github.com/str"
  },
  {
    "path": "git/filter_process_scanner.go",
    "chars": 6947,
    "preview": "// Package git contains various commands that shell out to git\n// NOTE: Subject to change, do not rely on this package f"
  },
  {
    "path": "git/filter_process_scanner_test.go",
    "chars": 4637,
    "preview": "package git\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"testing\"\n\n\t\"github.com/git-lfs/pktline\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"g"
  },
  {
    "path": "git/filter_process_status.go",
    "chars": 908,
    "preview": "package git\n\nimport \"github.com/git-lfs/git-lfs/v3/tr\"\n\n// FilterProcessStatus is a constant type representing the vario"
  },
  {
    "path": "git/git.go",
    "chars": 48738,
    "preview": "// Package git contains various commands that shell out to git\n// NOTE: Subject to change, do not rely on this package f"
  },
  {
    "path": "git/git_test.go",
    "chars": 22426,
    "preview": "package git_test // to avoid import cycles\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/g"
  },
  {
    "path": "git/gitattr/attr.go",
    "chars": 5409,
    "preview": "package gitattr\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"io\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"githu"
  },
  {
    "path": "git/gitattr/attr_test.go",
    "chars": 6035,
    "preview": "package gitattr\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestParseLines(t *"
  },
  {
    "path": "git/gitattr/files.go",
    "chars": 7512,
    "preview": "package gitattr\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/git-lfs/git-lf"
  },
  {
    "path": "git/gitattr/macro.go",
    "chars": 2081,
    "preview": "package gitattr\n\ntype MacroProcessor struct {\n\tmacros        map[string][]*Attr\n\tdidReadMacros bool\n}\n\n// NewMacroProces"
  },
  {
    "path": "git/gitattr/macro_test.go",
    "chars": 7753,
    "preview": "package gitattr\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestProcessLinesWithMacro"
  },
  {
    "path": "git/gitattr/tree.go",
    "chars": 5216,
    "preview": "package gitattr\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/git-lfs/git-lfs/v3/errors\"\n\t\"github.com/git-lfs/git-lfs/v"
  },
  {
    "path": "git/gitattr/tree_test.go",
    "chars": 9049,
    "preview": "package gitattr\n\nimport (\n\t\"testing\"\n\n\t\"github.com/git-lfs/gitobj/v2\"\n\t\"github.com/git-lfs/wildmatch/v2\"\n\t\"github.com/st"
  },
  {
    "path": "git/githistory/fixtures/identical-blobs.git/HEAD",
    "chars": 23,
    "preview": "ref: refs/heads/master\n"
  },
  {
    "path": "git/githistory/fixtures/identical-blobs.git/config",
    "chars": 137,
    "preview": "[core]\n\trepositoryformatversion = 0\n\tfilemode = true\n\tbare = false\n\tlogallrefupdates = true\n\tignorecase = true\n\tprecompo"
  },
  {
    "path": "git/githistory/fixtures/identical-blobs.git/logs/HEAD",
    "chars": 162,
    "preview": "0000000000000000000000000000000000000000 42723ad796caa500ddf4e3f6ad37600ed5a65491 Taylor Blau <me@ttaylorr.com> 14964400"
  },
  {
    "path": "git/githistory/fixtures/identical-blobs.git/logs/refs/heads/master",
    "chars": 162,
    "preview": "0000000000000000000000000000000000000000 42723ad796caa500ddf4e3f6ad37600ed5a65491 Taylor Blau <me@ttaylorr.com> 14964400"
  },
  {
    "path": "git/githistory/fixtures/identical-blobs.git/objects/42/723ad796caa500ddf4e3f6ad37600ed5a65491",
    "chars": 74,
    "preview": "x\u0001]\nB!\u0010F{v\u0015¿;\"DDkh\u0003N$h}hI\u0003\u0007{\u00150\u001dd2CBŦ-懳`L>\u00188 B)vy\twz[\u001dΝ\"_1Oy\u000b\u0018\u001f{Qju'wJ\u0006\u0005\u0001h8"
  },
  {
    "path": "git/githistory/fixtures/identical-blobs.git/refs/heads/master",
    "chars": 41,
    "preview": "42723ad796caa500ddf4e3f6ad37600ed5a65491\n"
  },
  {
    "path": "git/githistory/fixtures/linear-history-with-annotated-tags.git/HEAD",
    "chars": 23,
    "preview": "ref: refs/heads/master\n"
  },
  {
    "path": "git/githistory/fixtures/linear-history-with-annotated-tags.git/config",
    "chars": 137,
    "preview": "[core]\n\trepositoryformatversion = 0\n\tfilemode = true\n\tbare = false\n\tlogallrefupdates = true\n\tignorecase = true\n\tprecompo"
  },
  {
    "path": "git/githistory/fixtures/linear-history-with-annotated-tags.git/logs/HEAD",
    "chars": 457,
    "preview": "0000000000000000000000000000000000000000 91b85be6928569390e937479509b80a1d0dccb0c Taylor Blau <me@ttaylorr.com> 14969541"
  },
  {
    "path": "git/githistory/fixtures/linear-history-with-annotated-tags.git/logs/refs/heads/master",
    "chars": 457,
    "preview": "0000000000000000000000000000000000000000 91b85be6928569390e937479509b80a1d0dccb0c Taylor Blau <me@ttaylorr.com> 14969541"
  },
  {
    "path": "git/githistory/fixtures/linear-history-with-annotated-tags.git/refs/heads/master",
    "chars": 41,
    "preview": "d941e4756add6b06f5bee766fcf669f55419f13f\n"
  },
  {
    "path": "git/githistory/fixtures/linear-history-with-annotated-tags.git/refs/tags/middle",
    "chars": 41,
    "preview": "05797a38b05f910e6efe40dc1a5c0a046a9403e8\n"
  },
  {
    "path": "git/githistory/fixtures/linear-history-with-tags.git/HEAD",
    "chars": 23,
    "preview": "ref: refs/heads/master\n"
  },
  {
    "path": "git/githistory/fixtures/linear-history-with-tags.git/config",
    "chars": 137,
    "preview": "[core]\n\trepositoryformatversion = 0\n\tfilemode = true\n\tbare = false\n\tlogallrefupdates = true\n\tignorecase = true\n\tprecompo"
  },
  {
    "path": "git/githistory/fixtures/linear-history-with-tags.git/logs/HEAD",
    "chars": 457,
    "preview": "0000000000000000000000000000000000000000 91b85be6928569390e937479509b80a1d0dccb0c Taylor Blau <me@ttaylorr.com> 14969541"
  },
  {
    "path": "git/githistory/fixtures/linear-history-with-tags.git/logs/refs/heads/master",
    "chars": 457,
    "preview": "0000000000000000000000000000000000000000 91b85be6928569390e937479509b80a1d0dccb0c Taylor Blau <me@ttaylorr.com> 14969541"
  },
  {
    "path": "git/githistory/fixtures/linear-history-with-tags.git/refs/heads/master",
    "chars": 41,
    "preview": "d941e4756add6b06f5bee766fcf669f55419f13f\n"
  },
  {
    "path": "git/githistory/fixtures/linear-history-with-tags.git/refs/tags/middle",
    "chars": 41,
    "preview": "228afe30855933151f7a88e70d9d88314fd2f191\n"
  }
]

// ... and 431 more files (download for full content)

About this extraction

This page contains the full source code of the git-lfs/git-lfs GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 631 files (2.8 MB), approximately 763.6k tokens, and a symbol index with 2860 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!