ここにすべての回答を追加して、私の生活を少し快適にするコードを追加しました。BSD coreutils(MacOSのように)を期待します。
git-overlook
#!/usr/bin/env bash
path="$1"
root="$(git rev-parse --show-toplevel)"
if [ -z "$path" ]; then
echo "Specify a path" 1>&2
exit 1;
fi;
if [ ! -d .git/overlook ]; then
mkdir $root/.git/overlook
fi;
record="$root/.git/overlook/$(echo $path | sed 's/\./___/g' | sed 's/\//____/g')"
touch "$record"
git update-index --skip-worktree "$path"
git-relook
#!/usr/bin/env bash
path="$1"
root="$(git rev-parse --show-toplevel)"
record="$root/.git/overlook/$(echo $path | sed 's/\./___/g' | sed 's/\//____/g')"
if [ -f "$record" ]; then
git update-index --no-skip-worktree "$path"
rm "$record"
fi;
そして最後に.git/hooks/pre-commit
#!/bin/bash
set -eu
root="$(git rev-parse --show-toplevel)"
get_record_name() {
record="$root/.git/overlook/$(echo $1 | sed 's/\./___/g' | sed 's/\//____/g')"
echo "$record"
}
for file in $(git ls-files -v | grep ^S | sed 's/S //'); do
record="$(get_record_name $file)"
record_mtime="$(stat -f %m $record)"
file_mtime="$(stat -f %m $file)"
if [ "$record_mtime" -lt "$file_mtime" ]; then
echo "File $file is overlooked but has been modified since. Please run either git overlook $file or git relook $file" 1>&2
exit 1
else
echo "File $file is overlooked but hasn't been modified"
fi;
done;
これにより、実行できるようにgit overlook path/to/file
なり、見落とされたファイルを変更するまで、陽気な方法でコミットすることができます。変更した時点で、もう一度見落とすか、で戻す必要がありgit relook path/to/file
ます。明らかに、見落とされたファイルが私が行った唯一の変更であり、それがに表示されない場合は役に立ちませんgit status
。
それはものを追跡するためにいくつかのファイルを作成しますが.git/overlook
、私が知る限りgit
、それらと平和的に共存します。