diff options
-rw-r--r-- | Config.hs | 13 | ||||
-rw-r--r-- | Git.hs | 8 | ||||
-rw-r--r-- | debian/changelog | 3 | ||||
-rw-r--r-- | doc/git-annex-smudge.mdwn | 24 | ||||
-rw-r--r-- | doc/todo/smudge.mdwn | 4 | ||||
-rw-r--r-- | doc/upgrades.mdwn | 29 |
6 files changed, 60 insertions, 21 deletions
@@ -95,3 +95,16 @@ configureSmudgeFilter :: Annex () configureSmudgeFilter = do setConfig (ConfigKey "filter.annex.smudge") "git-annex smudge %f" setConfig (ConfigKey "filter.annex.clean") "git-annex smudge --clean %f" + lf <- Annex.fromRepo Git.attributesLocal + gf <- Annex.fromRepo Git.attributes + lfs <- readattr lf + gfs <- readattr gf + liftIO $ unless ("filter=annex" `isInfixOf` (lfs ++ gfs)) $ do + createDirectoryIfMissing True (takeDirectory lf) + writeFile lf (lfs ++ "\n" ++ stdattr) + where + readattr = liftIO . catchDefaultIO "" . readFileStrictAnyEncoding + stdattr = unlines + [ "* filter=annex" + , ".* !filter" + ] @@ -28,6 +28,7 @@ module Git ( repoPath, localGitDir, attributes, + attributesLocal, hookPath, assertLocal, adjustPath, @@ -125,8 +126,11 @@ assertLocal repo action {- Path to a repository's gitattributes file. -} attributes :: Repo -> FilePath attributes repo - | repoIsLocalBare repo = repoPath repo ++ "/info/.gitattributes" - | otherwise = repoPath repo ++ "/.gitattributes" + | repoIsLocalBare repo = attributesLocal repo + | otherwise = repoPath repo </> ".gitattributes" + +attributesLocal :: Repo -> FilePath +attributesLocal repo = localGitDir repo </> "info" </> "attributes" {- Path to a given hook script in a repository, only if the hook exists - and is executable. -} diff --git a/debian/changelog b/debian/changelog index f19a22b3e..5fde37c88 100644 --- a/debian/changelog +++ b/debian/changelog @@ -6,6 +6,9 @@ git-annex (6.20151117) UNRELEASED; urgency=medium versions of git-annex from working in that repository. * smudge: New command, used for git smudge filter. This will replace direct mode. + * init: Configure .git/info/attributes to use git-annex as a smudge + filter. Note that this changes the default behavior of git add in a + newly initialized repository; it will add files to the annex. * Build with -j1 again to get reproducible build. * Display progress meter in -J mode when copying from a local git repo, to a local git repo, and from a remote git repo. diff --git a/doc/git-annex-smudge.mdwn b/doc/git-annex-smudge.mdwn index 5186d2a17..c8e545367 100644 --- a/doc/git-annex-smudge.mdwn +++ b/doc/git-annex-smudge.mdwn @@ -12,24 +12,30 @@ This command lets git-annex be used as a git filter driver which lets annexed files in the git repository to be unlocked at all times, instead of being symlinks. -The git configuration to use this command as a filter driver is as follows, -but this is normally set up for you by git-annex init, so you should -not need to configure it manually: +When adding a file with `git add`, the annex.largefiles config is +consulted to decide if a given file should be added to git as-is, +or if its content are large enough to need to use git-annex. To force a +file that would normally be added to the annex to be added to git as-is, +this can be temporarily overridden. For example: + + git -c annex.largefiles='exclude=*' add myfile + +The git configuration to use this command as a filter driver is as follows. +This is normally set up for you by git-annex init, so you should +not need to configure it manually. [filter "annex"] smudge = git-annex smudge %f clean = git-annex smudge --clean %f -To make git use this filter on all files except for dotfiles, put something -like the following in the .gitattributes file: +To make git use that filter driver, it needs to be configured in +the .gitattributes file or in `.git/config/attributes`. The latter +is normally configured when a repository is initialized, with the following +contents: * filter=annex .* !filter -When adding a file with `git add`, the annex.largefiles config is -consulted to decide if a given file should be added to git as-is, -or if its content are large enough to need to use git-annex. - # SEE ALSO [[git-annex]](1) diff --git a/doc/todo/smudge.mdwn b/doc/todo/smudge.mdwn index 7a232123a..d08d600ae 100644 --- a/doc/todo/smudge.mdwn +++ b/doc/todo/smudge.mdwn @@ -306,7 +306,9 @@ just look at the repo content in the first place.. annex.version changes to 6 -On upgrade, update $GIT_DIR/info/attributes with a stock configuration, +git config for filter.annex.smudge and filter.annex.clean is set up. + +.gitattributes is updated with a stock configuration, unless it already mentions "filter=annex". Upgrading a direct mode repo needs to switch it out of bare mode, and diff --git a/doc/upgrades.mdwn b/doc/upgrades.mdwn index 7600d8e14..d69941cb1 100644 --- a/doc/upgrades.mdwn +++ b/doc/upgrades.mdwn @@ -48,21 +48,32 @@ The upgrade events, so far: The upgrade from v5 to v6 is handled manually. Run `git-annex upgrade` perform the upgrade. +This upgrade does away with the direct mode/indirect mode distinction. +A v6 git-annex repository can have some files locked and other files +unlocked, and all git and git-annex commands can be used on both locked and +unlocked files. (Although for locked files to work, the filesystem +must support symbolic links..) + +The behavior of some commands changes in an upgraded repository: + +* `git add` will add files to the annex, in unlocked mode, rather than + adding them directly to the git repository. To bypass that and add a file + directly to git, use: + + git -c annex.largefiles='exclude=*' add myfile + +* `git annex unlock` and `git annex lock` change how the pointer to + the annexed content is stored in git. + All places that a direct mode repository is cloned to should be running git-annex version 6.x before you upgrade the repository. This is necessary because the contents of the repository are changed in the upgrade, and the old version of git-annex won't be able to access files after the repo is upgraded. -If a repository is only used in indirect mode, this upgrade will not -affect it significantly. You can use git-annex v5 and v6 in different -clones of the same indirect mode repository without problems. - -This upgrade does away with the direct mode/indirect mode distinction. -A v6 git-annex repository can have some files locked and other files -unlocked, and all git and git-annex commands can be used on both locked and -unlocked files. (Although for locked files to work, the filesystem -must support symbolic links..) +If a repository is only used in indirect mode, you can use git-annex +v5 and v6 in different clones of the same indirect mode repository without +problems. On upgrade, all files in a direct mode repository will be converted to unlocked files. The upgrade will need to stage changes to all files in |