mirror of
https://github.com/git/git
synced 2024-08-27 19:49:21 +00:00
![Elijah Newren](/assets/img/avatar_default.png)
In the last few commits we focused on code in unpack-trees.c that mistakenly removed untracked files or directories. There may be more of those, but in this commit we change our focus: callers of toplevel commands that are expected to remove untracked files or directories. As noted previously, we have toplevel commands that are expected to delete untracked files such as 'read-tree --reset', 'reset --hard', and 'checkout --force'. However, that does not mean that other highlevel commands that happen to call these other commands thought about or conveyed to users the possibility that untracked files could be removed. Audit the code for such callsites, and add comments near existing callsites to mention whether these are safe or not. My auditing is somewhat incomplete, though; it skipped several cases: * git-rebase--preserve-merges.sh: is in the process of being deprecated/removed, so I won't leave a note that there are likely more bugs in that script. * contrib/git-new-workdir: why is the -f flag being used in a new empty directory?? It shouldn't hurt, but it seems useless. * git-p4.py: Don't see why -f is needed for a new dir (maybe it's not and is just superfluous), but I'm not at all familiar with the p4 stuff * git-archimport.perl: Don't care; arch is long since dead * git-cvs*.perl: Don't care; cvs is long since dead Also, the reset --hard in builtin/worktree.c looks safe, due to only running in an empty directory. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
103 lines
1.6 KiB
Bash
Executable file
103 lines
1.6 KiB
Bash
Executable file
#!/bin/sh
|
|
# Copyright (c) 2008, Nanako Shiraishi
|
|
# Prime rerere database from existing merge commits
|
|
|
|
me=rerere-train
|
|
USAGE=$(cat <<-EOF
|
|
usage: $me [--overwrite] <rev-list-args>
|
|
|
|
-h, --help show the help
|
|
-o, --overwrite overwrite any existing rerere cache
|
|
EOF
|
|
)
|
|
|
|
SUBDIRECTORY_OK=Yes
|
|
|
|
overwrite=0
|
|
|
|
while test $# -gt 0
|
|
do
|
|
opt="$1"
|
|
case "$opt" in
|
|
-h|--help)
|
|
echo "$USAGE"
|
|
exit 0
|
|
;;
|
|
-o|--overwrite)
|
|
overwrite=1
|
|
shift
|
|
break
|
|
;;
|
|
--)
|
|
shift
|
|
break
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Overwrite or help options are not valid except as first arg
|
|
for opt in "$@"
|
|
do
|
|
case "$opt" in
|
|
-h|--help)
|
|
echo "$USAGE"
|
|
exit 0
|
|
;;
|
|
-o|--overwrite)
|
|
echo "$USAGE"
|
|
exit 0
|
|
;;
|
|
esac
|
|
done
|
|
|
|
. "$(git --exec-path)/git-sh-setup"
|
|
require_work_tree
|
|
cd_to_toplevel
|
|
|
|
# Remember original branch
|
|
branch=$(git symbolic-ref -q HEAD) ||
|
|
original_HEAD=$(git rev-parse --verify HEAD) || {
|
|
echo >&2 "Not on any branch and no commit yet?"
|
|
exit 1
|
|
}
|
|
|
|
mkdir -p "$GIT_DIR/rr-cache" || exit
|
|
|
|
git rev-list --parents "$@" |
|
|
while read commit parent1 other_parents
|
|
do
|
|
if test -z "$other_parents"
|
|
then
|
|
# Skip non-merges
|
|
continue
|
|
fi
|
|
git checkout -q "$parent1^0"
|
|
if git merge $other_parents >/dev/null 2>&1
|
|
then
|
|
# Cleanly merges
|
|
continue
|
|
fi
|
|
if test $overwrite = 1
|
|
then
|
|
git rerere forget .
|
|
fi
|
|
if test -s "$GIT_DIR/MERGE_RR"
|
|
then
|
|
git show -s --pretty=format:"Learning from %h %s" "$commit"
|
|
git rerere
|
|
git checkout -q $commit -- .
|
|
git rerere
|
|
fi
|
|
git reset -q --hard # Might nuke untracked files...
|
|
done
|
|
|
|
if test -z "$branch"
|
|
then
|
|
git checkout "$original_HEAD"
|
|
else
|
|
git checkout "${branch#refs/heads/}"
|
|
fi
|