7 Commits

Author SHA1 Message Date
Ivan Malopinsky 8974b650ac recover HEAD ref, fix #77 2017-04-25 22:49:30 -04:00
Ivan Malopinsky e5ac597258 .freshignore support for local and remote branch cleanup 2016-09-30 22:13:52 -04:00
Ivan Malopinsky 9999e54375 start on branch ignore support 2016-09-25 22:55:09 -04:00
Ivan Malopinsky 30657dcd75 clean tracking information for missing upstreams
fix #63
2016-09-24 22:55:09 -04:00
Ivan Malopinsky 0b191ec2f9 1.8.0 2016-08-25 20:29:41 -04:00
Ivan Malopinsky 562a4b94ca do not change branch if already on root, add tests 2016-08-25 20:29:19 -04:00
Ivan Malopinsky 799199dcc2 add version command 2016-07-04 00:00:00 -04:00
3 changed files with 86 additions and 15 deletions
+5 -1
View File
@@ -7,10 +7,12 @@ Keep your repo fresh with one command.
```
Usage: git fresh [-fmrtRW] [-sl] [remote] [root]
By default, git-fresh will:
- rebase against remote current branch
- rebase against remote current branch
- stash changes
- prune remote branches
git-fresh will ignore any branches listed in a .freshignore file.
-f: Delete stale local and remote branches
-m: Merge remote root into current branch
-r: Rebase current branch against remote root
@@ -21,6 +23,8 @@ By default, git-fresh will:
-s: Apply stashed changes after run
-l: Only delete local stale branches
-v: Print git-fresh version and exit
remote: remote name, origin by default
root: root branch, master by default
```
+80 -13
View File
@@ -9,10 +9,12 @@ usage () {
cat << EOD
Usage: git fresh [-fmrtRW] [-sl] [remote] [root]
By default, git-fresh will:
- rebase against remote current branch
- rebase against remote current branch
- stash changes
- prune remote branches
git-fresh will ignore any branches listed in a .freshignore file.
-f: Delete stale local and remote branches
-m: Merge remote root into current branch
-r: Rebase current branch against remote root
@@ -23,6 +25,8 @@ By default, git-fresh will:
-s: Apply stashed changes after run
-l: Only delete local stale branches
-v: Print git-fresh version and exit
remote: remote name, origin by default
root: root branch, master by default
EOD
@@ -45,7 +49,7 @@ error () {
trap 'error $LINENO' ERR
while getopts ":fmrtslRWT" opt; do
while getopts ":fmrtslRWTv" opt; do
case $opt in
f)
FORCE_DELETE_STALE=true
@@ -74,6 +78,9 @@ while getopts ":fmrtslRWT" opt; do
T)
TEST=true
;;
v)
VERSION=1.8.2
;;
*)
usage
break
@@ -83,18 +90,35 @@ done
shift $((OPTIND-1))
# Are we in version mode?
if [[ ! -z $VERSION ]]; then
echo git-fresh $VERSION
exit 0
fi
# Are we in testing mode?
if [[ $TEST = true ]]; then
PATH=$(pwd):$PATH
TEST_DIR=/tmp/git-fresh-test
fail_test () {
echo 'Tests failed!'
rm -rf $TEST_DIR
exit 1
}
mkdir -p $TEST_DIR; cd $TEST_DIR
rm -rf $TEST_DIR; mkdir -p $TEST_DIR; cd $TEST_DIR
git init; touch test; git add test; git commit -am 'test'
git checkout -b test; rm test; git commit -am 'delete test'
git checkout master; git merge test; git checkout test
git-fresh -fr; rm -rf $TEST_DIR
git-fresh -fr; git rev-parse --verify test && fail_test || true
git checkout -b test; git checkout master; git-fresh; git checkout -
git rev-parse --abbrev-ref HEAD | grep -q test || fail_test
rm -rf $TEST_DIR
echo 'Tests passed!'
exit 0
fi
@@ -110,17 +134,34 @@ fi
# Are we in a non-empty git repository?
TOP_LEVEL_DIRECTORY=$(git rev-parse --show-toplevel)
[[ $(ls -1 "$TOP_LEVEL_DIRECTORY/.git/refs/heads" | wc -l | xargs) -eq "0" ]] && die "No HEAD ref available"
CURRENT=$(git rev-parse --abbrev-ref HEAD)
REMOTE=${1:-origin}
ROOT=${2:-master}
if [[ $(ls -1 "$TOP_LEVEL_DIRECTORY/.git/refs/heads" | wc -l | xargs) -eq "0" ]]; then
if git rev-parse --verify "$ROOT"; then
git rev-parse "$ROOT" > "$TOP_LEVEL_DIRECTORY/.git/refs/heads/$ROOT"
else
(git fsck --lost-found &> /dev/null; git checkout "$ROOT") || die "No HEAD ref available"
fi
fi
CURRENT=$(git rev-parse --abbrev-ref HEAD)
if [[ $(git remote -v | wc -l) -gt "0" ]]; then
REMOTES=true
fi
# Is this branch in .freshignore?
FRESH_IGNORE="$TOP_LEVEL_DIRECTORY/.freshignore"
if [[ -f $FRESH_IGNORE ]]; then
if [[ ! -z $(grep -Fx "$CURRENT" "$FRESH_IGNORE") ]]; then
die "Branch $CURRENT is ignored"
fi
fi
STASH_STAMP=git-fresh-$(date +%s)
# Stash changed files
@@ -145,9 +186,11 @@ if [[ $REMOTES = true ]]; then
fi
# Switch to root branch (master)
# If we are not already on root branch, switch to root branch (master)
git checkout $ROOT > /dev/null 2>&1
if [[ "$ROOT" != "$CURRENT" ]]; then
git checkout $ROOT > /dev/null 2>&1
fi
# Wipe workspace?
@@ -180,21 +223,37 @@ REMOTE_STALE=${REMOTE_STALE//remotes\/$REMOTE\/}
if [[ ! -z "${SMART_STALE// }" ]]; then
if [[ ! -z "${LOCAL_STALE// }" ]]; then
STALE_BRANCHES=true
if [[ -f "$FRESH_IGNORE" ]]; then
LOCAL_STALE=$(echo -n $LOCAL_STALE | tr " " "\n" | grep -Fxvf "$FRESH_IGNORE" | tr "\n" " ")
if [[ -z $LOCAL_STALE ]]; then
STALE_BRANCHES=false
fi
fi
if [[ "$FORCE_DELETE_STALE" = true ]]; then
echo -n $LOCAL_STALE | tr " " "\0" | xargs -0 git branch -d 2> /dev/null
else
say "Local stale branches found:" $(echo -n $LOCAL_STALE | tr "\n" " ")
if [[ $STALE_BRANCHES = true ]]; then
say "Local stale branches found:" $(echo -n $LOCAL_STALE | tr "\n" " ")
fi
fi
fi
if [[ ! -z "${REMOTE_STALE// }" ]]; then
STALE_BRANCHES=true
if [[ -f "$FRESH_IGNORE" ]]; then
REMOTE_STALE=$(echo -n $REMOTE_STALE | tr " " "\n" | grep -Fxvf "$FRESH_IGNORE" | tr "\n" " ")
if [[ -z $REMOTE_STALE ]]; then
STALE_BRANCHES=false
fi
fi
if [[ "$FORCE_DELETE_STALE" = true ]]; then
if [[ "$DELETE_ONLY_LOCAL" != true ]]; then
echo -n $REMOTE_STALE | tr " " "\0" | xargs -0 git push $REMOTE --delete
fi
else
say "Remote stale branches found:" $(echo -n $REMOTE_STALE | tr "\n" " ")
if [[ $STALE_BRANCHES = true ]]; then
say "Remote stale branches found:" $(echo -n $REMOTE_STALE | tr "\n" " ")
fi
fi
fi
@@ -203,10 +262,18 @@ if [[ ! -z "${SMART_STALE// }" ]]; then
fi
fi
# Remove tracking information for missing upstreams
if [[ ! -z $(git branch -vv | grep -F "[$REMOTE/$CURRENT: gone]") ]]; then
git branch --unset-upstream $CURRENT
fi
# Rebase or merge remote root against local branch
if [[ ! -z $(git rev-parse --verify --quiet "$CURRENT") ]]; then
git checkout $CURRENT
if [[ "$ROOT" != "$CURRENT" ]]; then
git checkout $CURRENT
fi
if [ "$REBASE" = true ] && [ "$MERGE" = true ]; then
say "Rebase and merge enabled, skipping both"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "git-fresh",
"version": "1.7.0",
"version": "1.9.0",
"description": "Utility to keep Git repositories fresh",
"global": true,
"repo": "imsky/git-fresh",