Hi,
a few folks from the Git LFS project and I try to make cloning of repositories
with a lot of LFS files faster.
The core problem is that Git LFS uses a Git smudge filter to replace LFS
pointers with the actual file content. Right now, a smudge filter can only
be executed on an individual file which makes the operation slow for many
files [1].
We solved this issue by temporarily disabling the smudge filter for the clone
command via Git config (optimized in 1a8630 [2]):
git -c filter.lfs.smudge= -c filter.lfs.required=false clone <url> <path>
Afterwards Git LFS runs a special command to download and replace all LFS
content in bulk [3]. This works great for LFS repositories.
However, I noticed that git config command line instructions such as
"-c filter.lfs.smudge=" are not passed to Git submodule operations. Thus
this does not work as expected:
git -c filter.lfs.smudge= -c filter.lfs.required=false clone --recursive
<url> <path>
I tried to work around that by copying the relevant pieced from the Git
Submodule command [4] and applying the command line Git config
manually (look closely at the modified checkout command):
git -c filter.lfs.smudge= -c filter.lfs.required=false clone $@
if [[ -z $2 ]]; then
CLONE_PATH=$(basename ${1%.git});
else
CLONE_PATH=$2;
fi
pushd "$CLONE_PATH"
git submodule init
wt_prefix=$(git rev-parse --show-prefix)
git submodule--helper list --prefix "$wt_prefix" | {
while read mode sha1 stage sm_path
do
name=$(git submodule--helper name "$sm_path") || exit
url=$(git config submodule."$name".url)
if ! test -d "$sm_path"/.git && ! test -f "$sm_path"/.git
then
git submodule--helper clone --prefix "$wt_prefix" --path
"$sm_path" --name "$name" --url "$url"
pushd "$sm_path"
git -c filter.lfs.smudge= -c filter.lfs.required=false
checkout -q $sha1 || exit
git-lfs pull || exit
popd
fi
done
}
popd
Do you see an easier way to pass command line Git config instructions to the
underlaying Git Submodule commands? If not, do you think a patch adding this
would be worth working on?
I also started a discussion about that on the Git LFS issue page [5].
Thanks,
Lars
[1] https://github.com/github/git-lfs/issues/931
[2] https://github.com/git/git/commit/1a8630dc3b1cc6f1361a4e5d94630133c24c97d9
[3] https://developer.atlassian.com/blog/2016/04/git-lfs-12-clone-faster/
[4]
https://github.com/git/git/blob/6a6636270fbaf74609cd3e1bd207dd2c420d640a/git-submodule.sh#L686-L731
[5] https://github.com/github/git-lfs/issues/1172
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html