ca4eeba59d
When migrating a repository to use Git LFS for the first time, a user is also required to run 'git lfs install' inside of their newly-migrated repository, lest they are unable to push. This is due to the fact that 'git lfs install' writes .git/hooks/pre-push, which Git invokes, in turn invoking Git LFS to push Git LFS objects to the remote before sending Git objects. Without this, we will push only plain-text pointer files, which puts the pusher at risk of loosing data, or failing any provider-specific verification/integrity checks. So, let's run installHooks() to place hooks in the right place, which makes the following command sequence possible: $ git lfs migrate import ... $ git push --all Let's avoid running this in 'git lfs migrate info' and 'git lfs migrate export', since neither require it.
796 lines
24 KiB
Bash
Executable File
796 lines
24 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
. "$(dirname "$0")/fixtures/migrate.sh"
|
|
. "$(dirname "$0")/testlib.sh"
|
|
|
|
begin_test "migrate import (default branch)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_local_branches
|
|
|
|
md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
|
|
txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
|
|
md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
|
|
|
|
git lfs migrate import
|
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120"
|
|
|
|
assert_local_object "$md_oid" "140"
|
|
assert_local_object "$txt_oid" "120"
|
|
refute_local_object "$md_feature_oid" "30"
|
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
feature="$(git rev-parse refs/heads/my-feature)"
|
|
|
|
master_attrs="$(git cat-file -p "$master:.gitattributes")"
|
|
[ ! $(git cat-file -p "$feature:.gitattributes") ]
|
|
|
|
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
|
|
echo "$master_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
|
|
|
|
# Ensure that hooks are installed. If we find 'git-lfs' somewhere in
|
|
# .git/hooks/pre-push we assume that the rest went correctly, too.
|
|
grep -q "git-lfs" .git/hooks/pre-push
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (bare repository)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_remote_branches
|
|
|
|
git lfs migrate import --everything
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (given branch)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_local_branches
|
|
|
|
md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
|
|
txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
|
|
md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
|
|
|
|
git lfs migrate import my-feature
|
|
|
|
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30"
|
|
assert_pointer "refs/heads/my-feature" "a.txt" "$txt_oid" "120"
|
|
assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120"
|
|
|
|
assert_local_object "$md_oid" "140"
|
|
assert_local_object "$md_feature_oid" "30"
|
|
assert_local_object "$txt_oid" "120"
|
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
feature="$(git rev-parse refs/heads/my-feature)"
|
|
|
|
master_attrs="$(git cat-file -p "$master:.gitattributes")"
|
|
feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
|
|
|
|
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
|
|
echo "$master_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
|
|
echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
|
|
echo "$feature_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (default branch with filter)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_local_branches
|
|
|
|
md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
|
|
txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
|
|
md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
|
|
|
|
git lfs migrate import --include "*.md"
|
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
|
|
|
|
assert_local_object "$md_oid" "140"
|
|
refute_local_object "$txt_oid" "120"
|
|
refute_local_object "$md_feature_oid" "30"
|
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
feature="$(git rev-parse refs/heads/my-feature)"
|
|
|
|
master_attrs="$(git cat-file -p "$master:.gitattributes")"
|
|
[ ! $(git cat-file -p "$feature:.gitattributes") ]
|
|
|
|
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
|
|
echo "$master_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (given branch with filter)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_local_branches
|
|
|
|
md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
|
|
txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
|
|
md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
|
|
|
|
git lfs migrate import --include "*.md" my-feature
|
|
|
|
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30"
|
|
assert_pointer "refs/heads/my-feature~1" "a.md" "$md_oid" "140"
|
|
|
|
assert_local_object "$md_oid" "140"
|
|
assert_local_object "$md_feature_oid" "30"
|
|
refute_local_object "$txt_oid" "120"
|
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
feature="$(git rev-parse refs/heads/my-feature)"
|
|
|
|
master_attrs="$(git cat-file -p "$master:.gitattributes")"
|
|
feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
|
|
|
|
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
|
|
echo "$master_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
|
|
echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
|
|
echo "$feature_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (default branch, exclude remote refs)"
|
|
(
|
|
set -e
|
|
|
|
setup_single_remote_branch
|
|
|
|
md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
|
|
txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
|
|
md_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
|
|
txt_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
|
|
|
|
git lfs migrate import
|
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_oid" "50"
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "30"
|
|
|
|
assert_local_object "$md_oid" "50"
|
|
assert_local_object "$txt_oid" "30"
|
|
refute_local_object "$md_remote_oid" "140"
|
|
refute_local_object "$txt_remote_oid" "120"
|
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
remote="$(git rev-parse refs/remotes/origin/master)"
|
|
|
|
master_attrs="$(git cat-file -p "$master:.gitattributes")"
|
|
[ ! $(git cat-file -p "$remote:.gitattributes") ]
|
|
|
|
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
|
|
echo "$master_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (given branch, exclude remote refs)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_remote_branches
|
|
|
|
md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
|
|
md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
|
|
md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
|
|
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
|
|
txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
|
|
txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
|
|
|
|
git lfs migrate import my-feature
|
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_master_oid" "21"
|
|
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "31"
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "20"
|
|
assert_pointer "refs/heads/my-feature" "a.txt" "$txt_feature_oid" "30"
|
|
|
|
assert_local_object "$md_feature_oid" "31"
|
|
assert_local_object "$md_master_oid" "21"
|
|
assert_local_object "$txt_feature_oid" "30"
|
|
assert_local_object "$txt_master_oid" "20"
|
|
refute_local_object "$md_remote_oid" "11"
|
|
refute_local_object "$txt_remote_oid" "10"
|
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
feature="$(git rev-parse refs/heads/my-feature)"
|
|
remote="$(git rev-parse refs/remotes/origin/master)"
|
|
|
|
master_attrs="$(git cat-file -p "$master:.gitattributes")"
|
|
[ ! $(git cat-file -p "$remote:.gitattributes") ]
|
|
feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
|
|
|
|
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
|
|
echo "$master_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
|
|
echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
|
|
echo "$feature_attrs" | grep -vq "*.txt filter=lfs diff=lfs merge=lfs"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (given ref, --skip-fetch)"
|
|
(
|
|
set -e
|
|
|
|
setup_single_remote_branch
|
|
|
|
md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
|
|
md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
|
|
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
|
|
txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
|
|
|
|
git tag pseudo-remote "$(git rev-parse refs/remotes/origin/master)"
|
|
# Remove the refs/remotes/origin/master ref, and instruct 'git lfs migrate' to
|
|
# not fetch it.
|
|
git update-ref -d refs/remotes/origin/master
|
|
|
|
git lfs migrate import --skip-fetch
|
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_master_oid" "50"
|
|
assert_pointer "pseudo-remote" "a.md" "$md_remote_oid" "140"
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "30"
|
|
assert_pointer "pseudo-remote" "a.txt" "$txt_remote_oid" "120"
|
|
|
|
assert_local_object "$md_master_oid" "50"
|
|
assert_local_object "$txt_master_oid" "30"
|
|
assert_local_object "$md_remote_oid" "140"
|
|
assert_local_object "$txt_remote_oid" "120"
|
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
remote="$(git rev-parse pseudo-remote)"
|
|
|
|
master_attrs="$(git cat-file -p "$master:.gitattributes")"
|
|
remote_attrs="$(git cat-file -p "$remote:.gitattributes")"
|
|
|
|
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
|
|
echo "$master_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
|
|
echo "$remote_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
|
|
echo "$remote_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (un-annotated tags)"
|
|
(
|
|
set -e
|
|
|
|
setup_single_local_branch_with_tags
|
|
|
|
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
|
|
|
|
git lfs migrate import --everything
|
|
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "2"
|
|
assert_local_object "$txt_master_oid" "2"
|
|
|
|
git tag --points-at "$(git rev-parse HEAD)" | grep -q "v1.0.0"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (annotated tags)"
|
|
(
|
|
set -e
|
|
|
|
setup_single_local_branch_with_annotated_tags
|
|
|
|
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
|
|
|
|
git lfs migrate import --everything
|
|
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "2"
|
|
assert_local_object "$txt_master_oid" "2"
|
|
|
|
git tag --points-at "$(git rev-parse HEAD)" | grep -q "v1.0.0"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (include/exclude ref)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_remote_branches
|
|
|
|
md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
|
|
md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
|
|
md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
|
|
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
|
|
txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
|
|
txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
|
|
|
|
git lfs migrate import \
|
|
--include-ref=refs/heads/my-feature \
|
|
--exclude-ref=refs/heads/master
|
|
|
|
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "31"
|
|
assert_pointer "refs/heads/my-feature" "a.txt" "$txt_feature_oid" "30"
|
|
|
|
assert_local_object "$md_feature_oid" "31"
|
|
refute_local_object "$md_master_oid" "21"
|
|
assert_local_object "$txt_feature_oid" "30"
|
|
refute_local_object "$txt_master_oid" "20"
|
|
refute_local_object "$md_remote_oid" "11"
|
|
refute_local_object "$txt_remote_oid" "10"
|
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
feature="$(git rev-parse refs/heads/my-feature)"
|
|
remote="$(git rev-parse refs/remotes/origin/master)"
|
|
|
|
[ ! $(git cat-file -p "$master:.gitattributes") ]
|
|
[ ! $(git cat-file -p "$remote:.gitattributes") ]
|
|
feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
|
|
|
|
echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
|
|
echo "$feature_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (include/exclude ref args)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_remote_branches
|
|
|
|
md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
|
|
md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
|
|
md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
|
|
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
|
|
txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
|
|
txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
|
|
|
|
git lfs migrate import my-feature ^master
|
|
|
|
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "31"
|
|
assert_pointer "refs/heads/my-feature" "a.txt" "$txt_feature_oid" "30"
|
|
|
|
assert_local_object "$md_feature_oid" "31"
|
|
refute_local_object "$md_master_oid" "21"
|
|
assert_local_object "$txt_feature_oid" "30"
|
|
refute_local_object "$txt_master_oid" "20"
|
|
refute_local_object "$md_remote_oid" "11"
|
|
refute_local_object "$txt_remote_oid" "10"
|
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
feature="$(git rev-parse refs/heads/my-feature)"
|
|
remote="$(git rev-parse refs/remotes/origin/master)"
|
|
|
|
[ ! $(git cat-file -p "$master:.gitattributes") ]
|
|
[ ! $(git cat-file -p "$remote:.gitattributes") ]
|
|
feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
|
|
|
|
echo "$feature_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
|
|
echo "$feature_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (include/exclude ref with filter)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_remote_branches
|
|
|
|
md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
|
|
md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
|
|
md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
|
|
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
|
|
txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
|
|
txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
|
|
|
|
git lfs migrate import \
|
|
--include="*.txt" \
|
|
--include-ref=refs/heads/my-feature \
|
|
--exclude-ref=refs/heads/master
|
|
|
|
assert_pointer "refs/heads/my-feature" "a.txt" "$txt_feature_oid" "30"
|
|
|
|
refute_local_object "$md_feature_oid" "31"
|
|
refute_local_object "$md_master_oid" "21"
|
|
assert_local_object "$txt_feature_oid" "30"
|
|
refute_local_object "$txt_master_oid" "20"
|
|
refute_local_object "$md_remote_oid" "11"
|
|
refute_local_object "$txt_remote_oid" "10"
|
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
feature="$(git rev-parse refs/heads/my-feature)"
|
|
remote="$(git rev-parse refs/remotes/origin/master)"
|
|
|
|
[ ! $(git cat-file -p "$master:.gitattributes") ]
|
|
[ ! $(git cat-file -p "$remote:.gitattributes") ]
|
|
feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
|
|
|
|
echo "$feature_attrs" | grep -vq "*.md filter=lfs diff=lfs merge=lfs"
|
|
echo "$feature_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (existing .gitattributes)"
|
|
(
|
|
set -e
|
|
|
|
setup_local_branch_with_gitattrs
|
|
|
|
pwd
|
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
|
|
txt_master_oid="$(calc_oid "$(git cat-file -p "$master:a.txt")")"
|
|
|
|
git lfs migrate import --yes --include-ref=refs/heads/master --include="*.txt"
|
|
|
|
assert_local_object "$txt_master_oid" "120"
|
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
prev="$(git rev-parse refs/heads/master^1)"
|
|
|
|
diff -u <(git cat-file -p $master:.gitattributes) <(cat <<-EOF
|
|
*.txt filter=lfs diff=lfs merge=lfs -text
|
|
*.other filter=lfs diff=lfs merge=lfs -text
|
|
EOF)
|
|
|
|
diff -u <(git cat-file -p $prev:.gitattributes) <(cat <<-EOF
|
|
*.txt filter=lfs diff=lfs merge=lfs -text
|
|
EOF)
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (bare repository)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_local_branches
|
|
make_bare
|
|
|
|
git lfs migrate import \
|
|
--include-ref=master
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (nested sub-trees, no filter)"
|
|
(
|
|
set -e
|
|
|
|
setup_single_local_branch_deep_trees
|
|
|
|
oid="$(calc_oid "$(git cat-file -p :foo/bar/baz/a.txt)")"
|
|
size="$(git cat-file -p :foo/bar/baz/a.txt | wc -c | awk '{ print $1 }')"
|
|
|
|
git lfs migrate import --everything
|
|
|
|
assert_local_object "$oid" "$size"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (prefix include(s))"
|
|
(
|
|
set -e
|
|
|
|
includes="foo/bar/baz foo/**/baz/a.txt *.txt"
|
|
for include in $includes; do
|
|
setup_single_local_branch_deep_trees
|
|
|
|
oid="$(calc_oid "$(git cat-file -p :foo/bar/baz/a.txt)")"
|
|
|
|
git lfs migrate import --include="$include"
|
|
|
|
assert_local_object "$oid" 120
|
|
|
|
cd ..
|
|
done
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (--everything)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_local_branches
|
|
git checkout master
|
|
|
|
master_txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
|
|
master_md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
|
|
feature_md_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
|
|
master_txt_size="$(git cat-file -p :a.txt | wc -c | awk '{ print $1 }')"
|
|
master_md_size="$(git cat-file -p :a.md | wc -c | awk '{ print $1 }')"
|
|
feature_md_size="$(git cat-file -p my-feature:a.md | wc -c | awk '{ print $1 }')"
|
|
|
|
git lfs migrate import --everything
|
|
|
|
assert_pointer "master" "a.txt" "$master_txt_oid" "$master_txt_size"
|
|
assert_pointer "master" "a.md" "$master_md_oid" "$master_md_size"
|
|
assert_pointer "my-feature" "a.md" "$feature_md_oid" "$feature_md_size"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (ambiguous reference)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_local_branches
|
|
|
|
# Create an ambiguously named reference sharing the name as the SHA-1 of
|
|
# "HEAD".
|
|
sha="$(git rev-parse HEAD)"
|
|
git tag "$sha"
|
|
|
|
git lfs migrate import --everything
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (--everything with args)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_local_branches
|
|
|
|
[ "$(git lfs migrate import --everything master 2>&1)" = \
|
|
"fatal: cannot use --everything with explicit reference arguments" ]
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (--everything with --include-ref)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_local_branches
|
|
|
|
[ "$(git lfs migrate import --everything --include-ref=refs/heads/master 2>&1)" = \
|
|
"fatal: cannot use --everything with --include-ref or --exclude-ref" ]
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (--everything with --exclude-ref)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_local_branches
|
|
|
|
[ "$(git lfs migrate import --everything --exclude-ref=refs/heads/master 2>&1)" = \
|
|
"fatal: cannot use --everything with --include-ref or --exclude-ref" ]
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (--everything and --include with glob pattern)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_local_branches
|
|
|
|
md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
|
|
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
|
|
md_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.md")")"
|
|
txt_feature_oid="$(calc_oid "$(git cat-file -p "refs/heads/my-feature:a.txt")")"
|
|
|
|
git lfs migrate import --verbose --everything --include='*.[mM][dD]'
|
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_master_oid" "140"
|
|
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30"
|
|
|
|
assert_local_object "$md_master_oid" "140"
|
|
assert_local_object "$md_feature_oid" "30"
|
|
refute_local_object "$txt_master_oid"
|
|
refute_local_object "$txt_feature_oid"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (nested sub-trees and --include with wildcard)"
|
|
(
|
|
set -e
|
|
|
|
setup_single_local_branch_deep_trees
|
|
|
|
oid="$(calc_oid "$(git cat-file -p :foo/bar/baz/a.txt)")"
|
|
size="$(git cat-file -p :foo/bar/baz/a.txt | wc -c | awk '{ print $1 }')"
|
|
|
|
git lfs migrate import --include="**/*ar/**"
|
|
|
|
assert_pointer "refs/heads/master" "foo/bar/baz/a.txt" "$oid" "$size"
|
|
assert_local_object "$oid" "$size"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (handle copies of files)"
|
|
(
|
|
set -e
|
|
|
|
setup_single_local_branch_deep_trees
|
|
|
|
# add the object from the sub-tree to the root directory
|
|
cp foo/bar/baz/a.txt a.txt
|
|
git add a.txt
|
|
git commit -m "duplicated file"
|
|
|
|
oid_root="$(calc_oid "$(git cat-file -p :a.txt)")"
|
|
oid_tree="$(calc_oid "$(git cat-file -p :foo/bar/baz/a.txt)")"
|
|
size="$(git cat-file -p :foo/bar/baz/a.txt | wc -c | awk '{ print $1 }')"
|
|
|
|
# only import objects under "foo"
|
|
git lfs migrate import --include="foo/**"
|
|
|
|
assert_pointer "refs/heads/master" "foo/bar/baz/a.txt" "$oid_tree" "$size"
|
|
assert_local_object "$oid_tree" "$size"
|
|
|
|
# "a.txt" is not under "foo" and therefore should not be in LFS
|
|
oid_root_after_migration="$(calc_oid "$(git cat-file -p :a.txt)")"
|
|
[ "$oid_root" = "$oid_root_after_migration" ]
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (--object-map)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_local_branches
|
|
|
|
output_dir=$(mktemp -d)
|
|
|
|
git log --all --pretty='format:%H' > "${output_dir}/old_sha.txt"
|
|
git lfs migrate import --everything --object-map "${output_dir}/object-map.txt"
|
|
git log --all --pretty='format:%H' > "${output_dir}/new_sha.txt"
|
|
paste -d',' "${output_dir}/old_sha.txt" "${output_dir}/new_sha.txt" > "${output_dir}/expected-map.txt"
|
|
|
|
diff -u <(sort "${output_dir}/expected-map.txt") <(sort "${output_dir}/object-map.txt")
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (--include with space)"
|
|
(
|
|
set -e
|
|
|
|
setup_local_branch_with_space
|
|
|
|
oid="$(calc_oid "$(git cat-file -p :"a file.txt")")"
|
|
|
|
git lfs migrate import --include "a file.txt"
|
|
|
|
assert_pointer "refs/heads/master" "a file.txt" "$oid" 50
|
|
cat .gitattributes
|
|
if [ 1 -ne "$(grep -c "a\[\[:space:\]\]file.txt" .gitattributes)" ]; then
|
|
echo >&2 "fatal: expected \"a[[:space:]]file.txt\" to appear in .gitattributes"
|
|
echo >&2 "fatal: got"
|
|
sed -e 's/^/ /g' < .gitattributes >&2
|
|
exit 1
|
|
fi
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (handle symbolic link)"
|
|
(
|
|
set -e
|
|
|
|
setup_local_branch_with_symlink
|
|
|
|
txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
|
|
link_oid="$(calc_oid "$(git cat-file -p :link.txt)")"
|
|
|
|
git lfs migrate import --include="*.txt"
|
|
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120"
|
|
|
|
assert_local_object "$txt_oid" "120"
|
|
# "link.txt" is a symbolic link so it should be not in LFS
|
|
refute_local_object "$link_oid" "5"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (commit --allow-empty)"
|
|
(
|
|
set -e
|
|
|
|
reponame="migrate---allow-empty"
|
|
git init "$reponame"
|
|
cd "$reponame"
|
|
|
|
git commit --allow-empty -m "initial commit"
|
|
|
|
original_head="$(git rev-parse HEAD)"
|
|
git lfs migrate import --everything
|
|
migrated_head="$(git rev-parse HEAD)"
|
|
|
|
assert_ref_unmoved "HEAD" "$original_head" "$migrated_head"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (multiple remotes)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_remotes
|
|
|
|
original_master="$(git rev-parse master)"
|
|
|
|
git lfs migrate import
|
|
|
|
migrated_master="$(git rev-parse master)"
|
|
|
|
assert_ref_unmoved "master" "$original_master" "$migrated_master"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (dirty copy, negative answer)"
|
|
(
|
|
set -e
|
|
|
|
setup_local_branch_with_dirty_copy
|
|
|
|
original_master="$(git rev-parse master)"
|
|
|
|
echo "n" | git lfs migrate import --everything 2>&1 | tee migrate.log
|
|
grep "migrate: working copy must not be dirty" migrate.log
|
|
|
|
migrated_master="$(git rev-parse master)"
|
|
|
|
assert_ref_unmoved "master" "$original_master" "$migrated_master"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (dirty copy, unknown then negative answer)"
|
|
(
|
|
set -e
|
|
|
|
setup_local_branch_with_dirty_copy
|
|
|
|
original_master="$(git rev-parse master)"
|
|
|
|
echo "x\nn" | git lfs migrate import --everything 2>&1 | tee migrate.log
|
|
|
|
cat migrate.log
|
|
|
|
[ "2" -eq "$(grep -o "override changes in your working copy" migrate.log \
|
|
| wc -l | awk '{ print $1 }')" ]
|
|
grep "migrate: working copy must not be dirty" migrate.log
|
|
|
|
migrated_master="$(git rev-parse master)"
|
|
|
|
assert_ref_unmoved "master" "$original_master" "$migrated_master"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (dirty copy, positive answer)"
|
|
(
|
|
set -e
|
|
|
|
setup_local_branch_with_dirty_copy
|
|
|
|
oid="$(calc_oid "$(git cat-file -p :a.txt)")"
|
|
|
|
echo "y" | git lfs migrate import --everything 2>&1 | tee migrate.log
|
|
grep "migrate: changes in your working copy will be overridden ..." \
|
|
migrate.log
|
|
|
|
assert_pointer "refs/heads/master" "a.txt" "$oid" "5"
|
|
assert_local_object "$oid" "5"
|
|
)
|
|
end_test
|
|
|
|
begin_test "migrate import (non-standard refs)"
|
|
(
|
|
set -e
|
|
|
|
setup_multiple_local_branches_non_standard
|
|
|
|
md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
|
|
txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
|
|
md_feature_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
|
|
|
|
git lfs migrate import --everything
|
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120"
|
|
assert_pointer "refs/pull/1/base" "a.md" "$md_oid" "140"
|
|
assert_pointer "refs/pull/1/base" "a.txt" "$txt_oid" "120"
|
|
|
|
assert_pointer "refs/heads/my-feature" "a.txt" "$txt_oid" "120"
|
|
assert_pointer "refs/pull/1/head" "a.txt" "$txt_oid" "120"
|
|
|
|
assert_local_object "$md_oid" "140"
|
|
assert_local_object "$txt_oid" "120"
|
|
assert_local_object "$md_feature_oid" "30"
|
|
)
|
|
end_test
|