2018-06-13 21:10:32 +00:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
2018-07-11 18:15:53 +00:00
|
|
|
. "$(dirname "$0")/fixtures/migrate.sh"
|
2018-07-10 18:48:02 +00:00
|
|
|
. "$(dirname "$0")/testlib.sh"
|
2018-06-13 21:10:32 +00:00
|
|
|
|
|
|
|
begin_test "migrate export (default branch)"
|
|
|
|
(
|
|
|
|
set -e
|
|
|
|
|
2018-06-23 00:11:44 +00:00
|
|
|
setup_multiple_local_branches_tracked
|
2018-06-13 21:10:32 +00:00
|
|
|
|
2018-06-28 21:58:41 +00:00
|
|
|
# Add b.md, a pointer existing only on master
|
|
|
|
base64 < /dev/urandom | head -c 160 > b.md
|
|
|
|
git add b.md
|
|
|
|
git commit -m "add b.md"
|
|
|
|
|
2018-06-23 00:11:44 +00:00
|
|
|
md_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
txt_oid="$(calc_oid "$(cat a.txt)")"
|
2018-06-28 21:58:41 +00:00
|
|
|
b_md_oid="$(calc_oid "$(cat b.md)")"
|
2018-06-13 21:10:32 +00:00
|
|
|
|
2018-06-23 00:11:44 +00:00
|
|
|
git checkout my-feature
|
|
|
|
md_feature_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
git checkout master
|
2018-06-13 21:10:32 +00:00
|
|
|
|
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
|
|
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120"
|
2018-06-28 21:58:41 +00:00
|
|
|
assert_pointer "refs/heads/master" "b.md" "$b_md_oid" "160"
|
2018-06-23 00:11:44 +00:00
|
|
|
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30"
|
2018-06-13 21:10:32 +00:00
|
|
|
|
|
|
|
git lfs migrate export --include="*.md, *.txt"
|
|
|
|
|
2018-07-02 22:02:44 +00:00
|
|
|
refute_pointer "refs/heads/master" "a.md"
|
|
|
|
refute_pointer "refs/heads/master" "a.txt"
|
|
|
|
refute_pointer "refs/heads/master" "b.md"
|
2018-06-23 00:11:44 +00:00
|
|
|
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "30"
|
2018-06-13 21:10:32 +00:00
|
|
|
|
2018-06-28 21:58:41 +00:00
|
|
|
# b.md should be pruned as no pointer exists to reference it
|
|
|
|
refute_local_object "$b_md_oid" "160"
|
|
|
|
|
|
|
|
# Other objects should not be pruned as they're still referenced in `feature`
|
|
|
|
# by pointers
|
|
|
|
assert_local_object "$md_oid" "140"
|
|
|
|
assert_local_object "$txt_oid" "120"
|
2018-06-26 18:18:35 +00:00
|
|
|
assert_local_object "$md_feature_oid" "30"
|
|
|
|
|
2018-06-13 21:10:32 +00:00
|
|
|
master="$(git rev-parse refs/heads/master)"
|
2018-06-23 00:11:44 +00:00
|
|
|
feature="$(git rev-parse refs/heads/my-feature)"
|
|
|
|
|
2018-06-13 21:10:32 +00:00
|
|
|
master_attrs="$(git cat-file -p "$master:.gitattributes")"
|
2018-06-23 00:11:44 +00:00
|
|
|
feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
|
2018-06-13 21:10:32 +00:00
|
|
|
|
2018-06-25 21:46:24 +00:00
|
|
|
echo "$master_attrs" | grep -q "*.md text !filter !merge !diff"
|
|
|
|
echo "$master_attrs" | grep -q "*.txt text !filter !merge !diff"
|
2018-06-23 00:11:44 +00:00
|
|
|
|
2018-06-25 21:46:24 +00:00
|
|
|
[ ! $(echo "$feature_attrs" | grep -q "*.md text !filter !merge !diff") ]
|
|
|
|
[ ! $(echo "$feature_attrs" | grep -q "*.txt text !filter !merge !diff") ]
|
2018-06-13 21:10:32 +00:00
|
|
|
)
|
|
|
|
end_test
|
2018-06-21 21:03:54 +00:00
|
|
|
|
|
|
|
begin_test "migrate export (with remote)"
|
|
|
|
(
|
|
|
|
set -e
|
|
|
|
|
|
|
|
setup_single_remote_branch_tracked
|
|
|
|
|
2018-06-23 00:11:44 +00:00
|
|
|
git push origin master
|
|
|
|
|
2018-06-21 21:03:54 +00:00
|
|
|
md_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
txt_oid="$(calc_oid "$(cat a.txt)")"
|
|
|
|
|
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_oid" "50"
|
|
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "30"
|
|
|
|
|
|
|
|
assert_pointer "refs/remotes/origin/master" "a.md" "$md_oid" "50"
|
|
|
|
assert_pointer "refs/remotes/origin/master" "a.txt" "$txt_oid" "30"
|
|
|
|
|
2018-06-26 22:34:19 +00:00
|
|
|
# Flush the cache to ensure all objects have to be downloaded
|
|
|
|
rm -rf .git/lfs/objects
|
|
|
|
|
2018-06-21 21:03:54 +00:00
|
|
|
git lfs migrate export --everything --include="*.md, *.txt"
|
|
|
|
|
2018-07-02 22:02:44 +00:00
|
|
|
refute_pointer "refs/heads/master" "a.md"
|
|
|
|
refute_pointer "refs/heads/master" "a.txt"
|
2018-06-21 21:03:54 +00:00
|
|
|
|
2018-06-28 21:58:41 +00:00
|
|
|
# All pointers have been exported, so all objects should be pruned
|
2018-06-26 18:18:35 +00:00
|
|
|
refute_local_object "$md_oid" "50"
|
|
|
|
refute_local_object "$txt_oid" "30"
|
|
|
|
|
2018-06-21 21:03:54 +00:00
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
|
|
master_attrs="$(git cat-file -p "$master:.gitattributes")"
|
|
|
|
|
2018-06-25 21:46:24 +00:00
|
|
|
echo "$master_attrs" | grep -q "*.md text !filter !merge !diff"
|
|
|
|
echo "$master_attrs" | grep -q "*.txt text !filter !merge !diff"
|
2018-06-21 21:03:54 +00:00
|
|
|
)
|
|
|
|
end_test
|
2018-06-23 00:11:44 +00:00
|
|
|
|
|
|
|
begin_test "migrate export (include/exclude args)"
|
|
|
|
(
|
|
|
|
set -e
|
|
|
|
|
2018-06-28 21:58:41 +00:00
|
|
|
setup_single_local_branch_tracked
|
2018-06-23 00:11:44 +00:00
|
|
|
|
|
|
|
md_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
txt_oid="$(calc_oid "$(cat a.txt)")"
|
|
|
|
|
|
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "120"
|
2018-06-28 21:58:41 +00:00
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
|
2018-06-23 00:11:44 +00:00
|
|
|
|
|
|
|
git lfs migrate export --include="*" --exclude="a.md"
|
|
|
|
|
2018-07-02 22:02:44 +00:00
|
|
|
refute_pointer "refs/heads/master" "a.txt"
|
2018-06-23 00:11:44 +00:00
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_oid" "140"
|
|
|
|
|
2018-06-26 18:18:35 +00:00
|
|
|
refute_local_object "$txt_oid" "120"
|
|
|
|
assert_local_object "$md_oid" "140"
|
|
|
|
|
2018-06-23 00:11:44 +00:00
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
|
|
|
|
|
|
master_attrs="$(git cat-file -p "$master:.gitattributes")"
|
|
|
|
|
2018-06-25 21:46:24 +00:00
|
|
|
echo "$master_attrs" | grep -q "* text !filter !merge !diff"
|
2018-06-23 00:11:44 +00:00
|
|
|
echo "$master_attrs" | grep -q "a.md filter=lfs diff=lfs merge=lfs"
|
|
|
|
)
|
|
|
|
end_test
|
|
|
|
|
|
|
|
begin_test "migrate export (bare repository)"
|
|
|
|
(
|
|
|
|
set -e
|
|
|
|
|
|
|
|
setup_single_remote_branch_tracked
|
|
|
|
git push origin master
|
2018-07-02 23:13:29 +00:00
|
|
|
|
|
|
|
md_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
txt_oid="$(calc_oid "$(cat a.txt)")"
|
2018-07-11 18:15:53 +00:00
|
|
|
|
2018-06-23 00:11:44 +00:00
|
|
|
make_bare
|
|
|
|
|
2018-07-02 23:13:29 +00:00
|
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "30"
|
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_oid" "50"
|
|
|
|
|
2018-06-23 00:11:44 +00:00
|
|
|
git lfs migrate export --everything --include="*"
|
2018-07-02 23:13:29 +00:00
|
|
|
|
|
|
|
refute_pointer "refs/heads/master" "a.md"
|
|
|
|
refute_pointer "refs/heads/master" "a.txt"
|
|
|
|
|
|
|
|
# All pointers have been exported, so all objects should be pruned
|
|
|
|
refute_local_object "$md_oid" "50"
|
|
|
|
refute_local_object "$txt_oid" "30"
|
2018-06-23 00:11:44 +00:00
|
|
|
)
|
|
|
|
end_test
|
|
|
|
|
|
|
|
begin_test "migrate export (given branch)"
|
|
|
|
(
|
|
|
|
set -e
|
|
|
|
|
|
|
|
setup_multiple_local_branches_tracked
|
|
|
|
|
|
|
|
md_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
txt_oid="$(calc_oid "$(cat a.txt)")"
|
|
|
|
|
|
|
|
git checkout my-feature
|
|
|
|
md_feature_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
git checkout master
|
|
|
|
|
|
|
|
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"
|
|
|
|
|
|
|
|
git lfs migrate export --include="*.md,*.txt" my-feature
|
|
|
|
|
2018-07-02 22:02:44 +00:00
|
|
|
refute_pointer "refs/heads/my-feature" "a.md"
|
|
|
|
refute_pointer "refs/heads/my-feature" "a.txt"
|
|
|
|
refute_pointer "refs/heads/master" "a.md"
|
|
|
|
refute_pointer "refs/heads/master" "a.txt"
|
2018-06-23 00:11:44 +00:00
|
|
|
|
2018-06-28 21:58:41 +00:00
|
|
|
# No pointers left, so all objects should be pruned
|
2018-06-26 18:18:35 +00:00
|
|
|
refute_local_object "$md_feature_oid" "30"
|
|
|
|
refute_local_object "$txt_oid" "120"
|
|
|
|
refute_local_object "$md_oid" "140"
|
|
|
|
|
2018-06-23 00:11:44 +00:00
|
|
|
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")"
|
|
|
|
|
2018-06-25 21:46:24 +00:00
|
|
|
echo "$master_attrs" | grep -q "*.md text !filter !merge !diff"
|
|
|
|
echo "$master_attrs" | grep -q "*.txt text !filter !merge !diff"
|
|
|
|
echo "$feature_attrs" | grep -q "*.md text !filter !merge !diff"
|
|
|
|
echo "$feature_attrs" | grep -q "*.txt text !filter !merge !diff"
|
2018-06-23 00:11:44 +00:00
|
|
|
)
|
|
|
|
end_test
|
|
|
|
|
|
|
|
begin_test "migrate export (no filter)"
|
|
|
|
(
|
|
|
|
set -e
|
|
|
|
|
|
|
|
setup_multiple_local_branches_tracked
|
|
|
|
|
commands: warn if working copy is dirty
In 'git lfs migrate import' and 'git lfs migrate export', Git LFS makes
destructive changes to a caller's repository and therefore invokes 'git
checkout --force', which throws away local changes.
To prevent this, let's introduce a check that notifies users when they
are going to throw away local changes, and allows for the user to abort
if they do not wish to discard their local changes.
With this, a user can safely migrate over dirty repositories (i.e., in
the case that they wanted to fix a file that should have been in Git
LFS, but wasn't) without having to finagle their repository to get it
into a migrate-able state.
For users with lots of pending migrations, also teach --yes, which
allows a user to avoid the check, and instead simply prints the warning
message to STDERR.
2018-07-10 15:18:46 +00:00
|
|
|
git lfs migrate export --yes 2>&1 | tee migrate.log
|
2018-06-23 00:11:44 +00:00
|
|
|
if [ ${PIPESTATUS[0]} -eq 0 ]; then
|
|
|
|
echo >&2 "fatal: expected git lfs migrate export to fail, didn't"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
grep "fatal: one or more files must be specified with --include" migrate.log
|
|
|
|
)
|
|
|
|
end_test
|
|
|
|
|
|
|
|
begin_test "migrate export (exclude remote refs)"
|
|
|
|
(
|
|
|
|
set -e
|
|
|
|
|
|
|
|
setup_single_remote_branch_tracked
|
|
|
|
|
|
|
|
md_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
txt_oid="$(calc_oid "$(cat a.txt)")"
|
|
|
|
|
|
|
|
git checkout refs/remotes/origin/master
|
|
|
|
md_remote_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
txt_remote_oid="$(calc_oid "$(cat a.txt)")"
|
|
|
|
git checkout master
|
|
|
|
|
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_oid" "50"
|
|
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "30"
|
|
|
|
|
|
|
|
assert_pointer "refs/remotes/origin/master" "a.md" "$md_remote_oid" "140"
|
|
|
|
assert_pointer "refs/remotes/origin/master" "a.txt" "$txt_remote_oid" "120"
|
|
|
|
|
|
|
|
git lfs migrate export --include="*.md,*.txt"
|
|
|
|
|
2018-07-02 22:02:44 +00:00
|
|
|
refute_pointer "refs/heads/master" "a.md"
|
|
|
|
refute_pointer "refs/heads/master" "a.txt"
|
2018-06-23 00:11:44 +00:00
|
|
|
|
2018-06-26 18:18:35 +00:00
|
|
|
refute_local_object "$md_oid" "50"
|
|
|
|
refute_local_object "$txt_oid" "30"
|
|
|
|
|
2018-06-23 00:11:44 +00:00
|
|
|
assert_pointer "refs/remotes/origin/master" "a.md" "$md_remote_oid" "140"
|
|
|
|
assert_pointer "refs/remotes/origin/master" "a.txt" "$txt_remote_oid" "120"
|
|
|
|
|
2018-06-28 21:58:41 +00:00
|
|
|
# Since these two objects exist on the remote, they should be removed with
|
|
|
|
# our prune operation
|
|
|
|
refute_local_object "$md_remote_oid" "140"
|
|
|
|
refute_local_object "$txt_remote_oid" "120"
|
2018-06-26 18:18:35 +00:00
|
|
|
|
2018-06-23 00:11:44 +00:00
|
|
|
master="$(git rev-parse refs/heads/master)"
|
|
|
|
remote="$(git rev-parse refs/remotes/origin/master)"
|
|
|
|
|
|
|
|
master_attrs="$(git cat-file -p "$master:.gitattributes")"
|
|
|
|
remote_attrs="$(git cat-file -p "$remote:.gitattributes")"
|
|
|
|
|
2018-06-25 21:46:24 +00:00
|
|
|
echo "$master_attrs" | grep -q "*.md text !filter !merge !diff"
|
|
|
|
echo "$master_attrs" | grep -q "*.txt text !filter !merge !diff"
|
2018-06-23 00:11:44 +00:00
|
|
|
|
2018-06-25 21:46:24 +00:00
|
|
|
[ ! $(echo "$remote_attrs" | grep -q "*.md text !filter !merge !diff") ]
|
|
|
|
[ ! $(echo "$remote_attrs" | grep -q "*.txt text !filter !merge !diff") ]
|
2018-06-23 00:11:44 +00:00
|
|
|
)
|
|
|
|
end_test
|
|
|
|
|
|
|
|
begin_test "migrate export (--skip-fetch)"
|
|
|
|
(
|
|
|
|
set -e
|
|
|
|
|
|
|
|
setup_single_remote_branch_tracked
|
|
|
|
|
|
|
|
md_master_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
txt_master_oid="$(calc_oid "$(cat a.txt)")"
|
|
|
|
|
|
|
|
git checkout refs/remotes/origin/master
|
|
|
|
md_remote_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
txt_remote_oid="$(calc_oid "$(cat a.txt)")"
|
|
|
|
git checkout master
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
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"
|
|
|
|
|
|
|
|
git lfs migrate export --skip-fetch --include="*.md,*.txt"
|
|
|
|
|
2018-07-02 22:02:44 +00:00
|
|
|
refute_pointer "refs/heads/master" "a.md"
|
|
|
|
refute_pointer "pseudo-remote" "a.md"
|
|
|
|
refute_pointer "refs/heads/master" "a.txt"
|
|
|
|
refute_pointer "pseudo-remote" "a.txt"
|
2018-06-23 00:11:44 +00:00
|
|
|
|
2018-06-26 18:18:35 +00:00
|
|
|
refute_local_object "$md_master_oid" "50"
|
|
|
|
refute_local_object "$md_remote_oid" "140"
|
|
|
|
refute_local_object "$txt_master_oid" "30"
|
|
|
|
refute_local_object "$txt_remote_oid" "120"
|
|
|
|
|
2018-06-23 00:11:44 +00:00
|
|
|
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")"
|
|
|
|
|
2018-06-25 21:46:24 +00:00
|
|
|
echo "$master_attrs" | grep -q "*.md text !filter !merge !diff"
|
|
|
|
echo "$master_attrs" | grep -q "*.txt text !filter !merge !diff"
|
|
|
|
echo "$remote_attrs" | grep -q "*.md text !filter !merge !diff"
|
|
|
|
echo "$remote_attrs" | grep -q "*.txt text !filter !merge !diff"
|
2018-06-23 00:11:44 +00:00
|
|
|
)
|
|
|
|
end_test
|
|
|
|
|
|
|
|
begin_test "migrate export (include/exclude ref)"
|
|
|
|
(
|
|
|
|
set -e
|
|
|
|
|
|
|
|
setup_multiple_remote_branches_gitattrs
|
|
|
|
|
|
|
|
md_master_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
txt_master_oid="$(calc_oid "$(cat a.txt)")"
|
|
|
|
|
|
|
|
git checkout refs/remotes/origin/master
|
|
|
|
md_remote_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
txt_remote_oid="$(calc_oid "$(cat a.txt)")"
|
|
|
|
|
|
|
|
git checkout my-feature
|
|
|
|
md_feature_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
txt_feature_oid="$(calc_oid "$(cat a.txt)")"
|
|
|
|
|
|
|
|
git checkout master
|
|
|
|
|
|
|
|
git lfs migrate export \
|
|
|
|
--include="*.txt" \
|
|
|
|
--include-ref=refs/heads/my-feature \
|
|
|
|
--exclude-ref=refs/heads/master
|
2018-07-11 18:15:53 +00:00
|
|
|
|
2018-06-23 00:11:44 +00:00
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_master_oid" "21"
|
|
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "20"
|
|
|
|
|
|
|
|
assert_pointer "refs/remotes/origin/master" "a.md" "$md_remote_oid" "11"
|
|
|
|
assert_pointer "refs/remotes/origin/master" "a.txt" "$txt_remote_oid" "10"
|
|
|
|
|
|
|
|
assert_pointer "refs/heads/my-feature" "a.md" "$md_feature_oid" "31"
|
2018-07-02 22:02:44 +00:00
|
|
|
refute_pointer "refs/heads/my-feature" "a.txt"
|
2018-06-23 00:11:44 +00:00
|
|
|
|
2018-06-28 21:58:41 +00:00
|
|
|
# Master objects should not be pruned as they exist in unpushed commits
|
2018-06-26 18:18:35 +00:00
|
|
|
assert_local_object "$md_master_oid" "21"
|
|
|
|
assert_local_object "$txt_master_oid" "20"
|
|
|
|
|
2018-06-28 21:58:41 +00:00
|
|
|
# Remote master objects should be pruned as they exist in the remote
|
|
|
|
refute_local_object "$md_remote_oid" "11"
|
|
|
|
refute_local_object "$txt_remote_oid" "10"
|
2018-06-26 18:18:35 +00:00
|
|
|
|
2018-06-28 21:58:41 +00:00
|
|
|
# txt_feature_oid should be pruned as it's no longer a pointer, but
|
|
|
|
# md_feature_oid should remain as it's still a pointer in unpushed commits
|
2018-06-26 18:18:35 +00:00
|
|
|
assert_local_object "$md_feature_oid" "31"
|
|
|
|
refute_local_object "$txt_feature_oid" "30"
|
|
|
|
|
2018-06-23 00:11:44 +00:00
|
|
|
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")"
|
|
|
|
remote_attrs="$(git cat-file -p "$remote:.gitattributes")"
|
|
|
|
feature_attrs="$(git cat-file -p "$feature:.gitattributes")"
|
|
|
|
|
2018-06-25 21:46:24 +00:00
|
|
|
[ ! $(echo "$master_attrs" | grep -q "*.txt text !filter !merge !diff") ]
|
|
|
|
[ ! $(echo "$remote_attrs" | grep -q "*.txt text !filter !merge !diff") ]
|
|
|
|
echo "$feature_attrs" | grep -q "*.txt text !filter !merge !diff"
|
2018-06-23 00:11:44 +00:00
|
|
|
)
|
|
|
|
end_test
|
2018-06-25 20:06:43 +00:00
|
|
|
|
|
|
|
begin_test "migrate export (--object-map)"
|
|
|
|
(
|
|
|
|
set -e
|
|
|
|
|
|
|
|
setup_multiple_local_branches_tracked
|
|
|
|
|
|
|
|
output_dir=$(mktemp -d)
|
|
|
|
|
|
|
|
git log --all --pretty='format:%H' > "${output_dir}/old_sha.txt"
|
|
|
|
git lfs migrate export --everything --include="*" --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 export (--verbose)"
|
|
|
|
(
|
|
|
|
set -e
|
|
|
|
|
|
|
|
setup_multiple_local_branches_tracked
|
|
|
|
|
|
|
|
git lfs migrate export --everything --include="*" --verbose 2>&1 | grep -q "migrate: commit "
|
|
|
|
)
|
|
|
|
end_test
|
2018-06-27 18:03:23 +00:00
|
|
|
|
|
|
|
begin_test "migrate export (--remote)"
|
|
|
|
(
|
|
|
|
set -e
|
|
|
|
|
|
|
|
setup_single_remote_branch_tracked
|
|
|
|
|
|
|
|
git push origin master
|
|
|
|
|
|
|
|
md_oid="$(calc_oid "$(cat a.md)")"
|
|
|
|
txt_oid="$(calc_oid "$(cat a.txt)")"
|
|
|
|
|
|
|
|
assert_pointer "refs/heads/master" "a.md" "$md_oid" "50"
|
|
|
|
assert_pointer "refs/heads/master" "a.txt" "$txt_oid" "30"
|
|
|
|
|
|
|
|
# Flush the cache to ensure all objects have to be downloaded
|
|
|
|
rm -rf .git/lfs/objects
|
|
|
|
|
|
|
|
# Setup a new remote and invalidate the default
|
|
|
|
remote_url="$(git config --get remote.origin.url)"
|
|
|
|
git remote add zeta "$remote_url"
|
|
|
|
git remote set-url origin ""
|
|
|
|
|
|
|
|
git lfs migrate export --everything --remote="zeta" --include="*.md, *.txt"
|
|
|
|
|
2018-07-02 22:02:44 +00:00
|
|
|
refute_pointer "refs/heads/master" "a.md"
|
|
|
|
refute_pointer "refs/heads/master" "a.txt"
|
2018-06-27 18:03:23 +00:00
|
|
|
|
|
|
|
refute_local_object "$md_oid" "50"
|
|
|
|
refute_local_object "$txt_oid" "30"
|
|
|
|
)
|
|
|
|
end_test
|
|
|
|
|
|
|
|
begin_test "migrate export (invalid --remote)"
|
|
|
|
(
|
|
|
|
set -e
|
|
|
|
|
|
|
|
setup_single_remote_branch_tracked
|
|
|
|
|
commands: warn if working copy is dirty
In 'git lfs migrate import' and 'git lfs migrate export', Git LFS makes
destructive changes to a caller's repository and therefore invokes 'git
checkout --force', which throws away local changes.
To prevent this, let's introduce a check that notifies users when they
are going to throw away local changes, and allows for the user to abort
if they do not wish to discard their local changes.
With this, a user can safely migrate over dirty repositories (i.e., in
the case that they wanted to fix a file that should have been in Git
LFS, but wasn't) without having to finagle their repository to get it
into a migrate-able state.
For users with lots of pending migrations, also teach --yes, which
allows a user to avoid the check, and instead simply prints the warning
message to STDERR.
2018-07-10 15:18:46 +00:00
|
|
|
git lfs migrate export --include="*" --remote="zz" --yes 2>&1 \
|
|
|
|
| tee migrate.log
|
2018-06-27 18:03:23 +00:00
|
|
|
if [ ${PIPESTATUS[0]} -eq 0 ]; then
|
|
|
|
echo >&2 "fatal: expected git lfs migrate export to fail, didn't"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
grep "fatal: invalid remote zz provided" migrate.log
|
|
|
|
)
|
2018-07-02 23:13:29 +00:00
|
|
|
end_test
|