f-git-bash
Git for Windows に付属するmintty経由でgit bashを起動する。
シェルの中にあるフォントの設定などは変更して欲しい。
# 別ウィンドウでminttyを開いてgit bashを起動する
# 引数があればコマンドと見なして実行する
function f-git-bash {
# mintty config file 作成
$mintty_config_file = "${HOME}/.minttyrc"
if ( Test-Path $mintty_config_file ) {
Remove-Item $mintty_config_file
}
Write-Output "BoldAsFont=no" | Add-Content -Encoding UTF8 "${mintty_config_file}"
Write-Output "# Font=Ricty Diminished" | Add-Content -Encoding UTF8 "${mintty_config_file}"
Write-Output "# Font=Consolas" | Add-Content -Encoding UTF8 "${mintty_config_file}"
Write-Output "Font=Cascadia Mono" | Add-Content -Encoding UTF8 "${mintty_config_file}"
Write-Output "FontHeight=12" | Add-Content -Encoding UTF8 "${mintty_config_file}"
Write-Output "Columns=120" | Add-Content -Encoding UTF8 "${mintty_config_file}"
Write-Output "Rows=28" | Add-Content -Encoding UTF8 "${mintty_config_file}"
Write-Output "RightClickAction=paste" | Add-Content -Encoding UTF8 "${mintty_config_file}"
Write-Output "Transparency=low" | Add-Content -Encoding UTF8 "${mintty_config_file}"
Write-Output "CursorType=block" | Add-Content -Encoding UTF8 "${mintty_config_file}"
Write-Output "BackgroundColour=0,30,0" | Add-Content -Encoding UTF8 "${mintty_config_file}"
Write-Output "Language=ja" | Add-Content -Encoding UTF8 "${mintty_config_file}"
Write-Output "ForegroundColour=255,255,255" | Add-Content -Encoding UTF8 "${mintty_config_file}"
Write-Output "CopyAsRTF=no" | Add-Content -Encoding UTF8 "${mintty_config_file}"
if ( $args.Length -eq 0 ) {
& "C:/Program Files/Git/usr/bin/mintty.exe" --config "${mintty_config_file}" "--exec" "/usr/bin/bash" "--login" "-i"
}
else {
& "C:/Program Files/Git/usr/bin/mintty.exe" --config "${mintty_config_file}" "--exec" "/usr/bin/bash" "--login" "-c" "$args"
}
}
f-afxw
あふを起動するpowershellスクリプト。
# afxwを別ウィンドウで起動する
# 起動中のafxw画面を使う場合は -s オプションを追加すること
function f-afxw {
AFXW.EXE -L"$PWD\\" -R"$PWD\\"
}
afxwの設定ファイル
[KEY_DEF] KEY_00="C:\Windows\explorer.exe "$P"" KEY_01="c:\windows\system32\cmd.exe /c copy "$P\$F" "$P\$W.copy.$E"" KEY_02=""C:\Program Files\PowerShell\7\pwsh.exe" -NoExit -Command "cd $P"" KEY_03="javaw.exe -jar C:\home\bin\javaecho.jar $MF" KEY_04="C:\Program Files\Notepad++\notepad++.exe -multiInst "$P\$F"" KEY_05=""C:\Program Files\Microsoft VS Code\Code.exe" . "$F"" KEY_07=""C:\Program Files\IrfanView\i_view64.exe" "$P\$F"" KEY_08="C:\home\bin\FileDateZip2.bat -post $MF" KEY_09=""C:\HOME\01-desktop-tools\つんでれんこtde277\【ここに動画をD&D】.bat" $MF" KEY_10="winmergeu.exe -f "*.*" -r $MF $MO" KEY_12=""C:\Program Files (x86)\TeraPad\TeraPad.exe" "$P\$F"" KEY_13=""C:\Program Files (x86)\sakura\sakura.exe" "$P\$F"" KEY_14="c:\windows\system32\cmd.exe /k "cd $P"" KEY_17=""C:\Program Files\Microsoft VS Code\Code.exe" "$P"" KEY_20="c:\home\bin\FileDateZip2.bat -post $MF -exclude .git -exclude .github -exclude Snapshots -exclude "Virtual Hard Disks" -exclude vagranthdd" BTN_00="explorer" BTN_01="copy" BTN_02="powershell" BTN_03="echo" BTN_04="notepad++ MW" BTN_05="code file" BTN_07="irfanview" BTN_08="javaZip" BTN_09="tundere" BTN_10="winmerge other" BTN_12="TeraPad" BTN_13="sakura" BTN_14="cmd" BTN_17="code dir" BTN_20="JavaZipExGit"
f-type
PowerShellのGet-Commandが覚えにくいので作った。
# bashのtypeみたいなコマンド
function f-type {
$cmd, $args = $args
Get-Command $cmd | Select-Object -ExpandProperty Definition
}
# コマンドが存在するかチェックだけする
# コマンドが存在すればTrueを返却
function f-type-silent {
$cmd, $args = $args
Get-Command $cmd -ea SilentlyContinue | Out-Null
$RC = $?
return $RC
}
git系コマンドのメモシェル(git-bash用)
#!/bin/bash
#
# git操作共通関数
#
function f_git() {
echo "git $@"
git "$@"
local RC=$?
if [ $RC -ne 0 ]; then
echo "ERROR: git $@ failed."
fi
return $RC
}
function git-user-name() {
# GIT_IDを取得する
local GIT_ID=`git config --global --list|grep user.name| sed 's/user.name=//g'`
if [ -z "$GIT_ID" ]; then
echo user_name_is_null
return 1
fi
# スペースはアンダースコアに変換
GIT_ID=$( echo $GIT_ID | sed -e 's/ /_/g' )
echo $GIT_ID
}
function git-status-check() {
if git status | grep "nothing to commit, working tree clean" 1>/dev/null 2>/dev/null ; then
echo "CLEAN"
else
echo "DURTY"
fi
}
function git-lol() {
# ログ表示
f_git log --graph --decorate --pretty=oneline --abbrev-commit
}
function git-lola() {
# ログ表示
f_git log --graph --decorate --pretty=oneline --abbrev-commit --all
}
function git-ls-files() {
# ファイルのアクセス許可属性の表示
f_git ls-files -s
}
function git-branch-a() {
echo "ブランチ一覧"
f_git branch -a
}
function git-branch-vv() {
echo "ブランチが追跡しているorigin一覧"
echo "追跡するリモートブランチを設定する場合は git branch --set-upstream-to=origin/[ブランチ名]"
f_git branch -vv
}
# よくあるgitの初期化を実施する
function git-initialize() {
# コミットする時に保存されるユーザー名とメールアドレス
git config --global user.name "Jun Obama"
git config --global user.email "george@yk.rim.or.jp"
# 日本語パス名の文字化け対策
git config --global core.quotepath false
# 改行コードの自動変換の無効化。
git config --global core.autocrlf false
# ページャーは使用しない
# git config --global core.pager ''
# 自己署名な証明書を許可する
git config --global http.sslVerify false
# gitの認証情報を保存する
git config --global credential.helper store
# push を upstreamが設定されているものに限定する
# git config --global push.default upstream
# git ver 2.0 以降では simple がデフォルト。upstreamが設定されていて、かつ、ローカルとリモートで名前が同じブランチのみpushする。
git config --global push.default simple
# git pull した時の戦略。マージする。(rebaseはしない)
git config --global pull.rebase false
# ファイル名の大文字小文字の変動を追尾する
git config --global core.ignorecase false
# 各リポジトリの中で実施するコマンド
#if [ -d .git ] ; then
# git pull した時の戦略。マージする。(rebaseはしない)(各gitリポジトリ内で実施)
# git config pull.rebase false
# ファイル名の大文字小文字の変動を追尾する
# git config core.ignorecase false
#fi
}
function git-dirs() {
# 全階層のgit clone のリストを作成する。
local GIT_CLONE_DIR_LIST=`find . -name ".git" | egrep -v '\bpkg\b' | egrep -v '\bdep\b' | sed -e 's%.git$%%g' | sed -e 's%/$%%g' `
echo $GIT_CLONE_DIR_LIST
if [ -z "$GIT_CLONE_DIR_LIST" ]; then
return 1
fi
}
function git-branch-status-all() {
local GIT_ID=$( git-user-name )
local GIT_CLONE_DIR_LIST=$( git-dirs )
for GIT_CLONE_DIR in $GIT_CLONE_DIR_LIST
do
SAVED_PWD=$PWD
cd ${GIT_CLONE_DIR}
echo "------------------------------"
echo "----- ${GIT_CLONE_DIR} "
echo "------------------------------"
# git fetch --prune
f_git status
echo ""
cd $SAVED_PWD
done
}
# pull request が全部消化された時に、developに戻す際に使う
# ユーザー名が含まれており、ローカルにだけあるブランチは消す (!注意!)
# dep,pkgというディレクトリの下の.gitは無視する。depコマンドで拾った依存ライブラリはgit pullしない。
function git-branch-clean-all() {
local GIT_ID=$( git-user-name )
local GIT_CLONE_DIR_LIST=$( git-dirs )
echo "#"
echo "# delete ${GIT_ID}'s branches"
echo "#"
# リスト毎に"$GIT_ID/#*"ブランチを削除する。
for GIT_CLONE_DIR in $GIT_CLONE_DIR_LIST
do
local GIT_DEFAULT_BRANCH_NAME=develop
SAVED_PWD=$PWD
cd ${GIT_CLONE_DIR}
echo "------------------------------"
echo "----- ${GIT_CLONE_DIR} "
echo "------------------------------"
# fetch する。リモートリポジトリでは削除されているブランチは、削除する。
f_git fetch --prune
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# カレントブランチを取得する
CUR_BRANCH=`git branch | grep '^*' | sed -e 's/^\*/ /g' -e 's/^ //g'`
# ブランチ一覧を取得する
BR_LIST=`git branch | sed 's/^\*/ /g'`
# リモートブランチ一覧取得
BR_LIST_2=$( git branch -a | sed 's/^\*/ /g' | grep remotes/origin )
# リモートブランチにdevelopがある場合は、developを採用。次に master, main を検索していく。
if [ -n "$( echo $BR_LIST_2 | grep develop )" ]; then
GIT_DEFAULT_BRANCH_NAME=develop
elif [ -n "$( echo $BR_LIST_2 | grep master )" ]; then
GIT_DEFAULT_BRANCH_NAME=master
elif [ -n "$( echo $BR_LIST_2 | grep main )" ]; then
GIT_DEFAULT_BRANCH_NAME=main
else
echo "can not determine default remote branch name. abort."
return 1
fi
echo "GIT_DEFAULT_BRANCH_NAME is $GIT_DEFAULT_BRANCH_NAME"
# カレントブランチがdirtyではなく、developまたはmasterまたはmainの場合は、git pullを行う
STATUS=$( git status | grep "nothing to commit" )
if [ ! -z "$STATUS" ]; then
if [ x"$CUR_BRANCH"x = x"master"x -o x"$CUR_BRANCH"x = x"develop"x -o x"$CUR_BRANCH"x = x"main"x ]; then
f_git pull
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
else
echo "workspace is not master nor develop nor main branch. skip git pull."
fi
else
echo "workspace is durty. skip git pull."
fi
# ローカルブランチの掃除
for BR in ${BR_LIST};
do
# 自分のユーザー名を含むブランチのみお掃除対象
if [ `echo "${BR}" | grep "$GIT_ID"` ] ; then
STATUS=$( git status | grep "nothing to commit" )
if [ -z "$STATUS" ]; then
# カレントブランチがdirtyな場合は掃除しない
echo "directory: $GIT_CLONE_DIR , branch: $CUR_BRANCH is not clean. skip git branch -d $BR."
elif [ ! -z "$( echo $BR_LIST_2 | grep $BR )" ]; then
# remoteブランチに残っている場合は残す
echo "directory: $GIT_CLONE_DIR , branch: $BR has remote branch. skip git branch -d $BR."
elif [ x"$BR"x == x"$CUR_BRANCH"x ]; then
# currentブランチがリモートにない場合はデフォルトブランチ名(developまたはmaster)に戻してブランチは削除する
f_git checkout $GIT_DEFAULT_BRANCH_NAME
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
f_git pull
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
f_git branch -d ${BR}
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
else
f_git branch -d ${BR}
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
fi
fi
done
echo ""
cd $SAVED_PWD
done
}
function git-branch-test-tag-exists() {
# 引数で指定した名前のタグが存在するかチェック
local ARG_TAG_NAME=$1
if [ -z "$ARG_TAG_NAME" ] ; then
echo "git-branch-test-tag-exists: tag-name"
return 1
fi
local RESULT=$( git tag -l | egrep -e '^'"$ARG_TAG_NAME"'$' )
if [ -z "$RESULT" ] ; then
echo "NOTFOUND"
return
fi
echo "FOUND"
}
function git-branch-test-local-branch-exists() {
# 引数で指定した名前のローカルブランチが存在するかチェック
local ARG_BRANCH_NAME=$1
if [ -z "$ARG_BRANCH_NAME" ] ; then
echo "git-branch-test-local-branch-exists: branch-name"
return 1
fi
local RESULT=$( git branch -a | sed -e 's/^* / /g' | awk '{print $1}' | egrep -e '^'"$ARG_BRANCH_NAME"'$' )
if [ -z "$RESULT" ] ; then
echo "NOTFOUND"
return
fi
echo "FOUND"
}
function git-branch-test-remote-branch-exists() {
# 引数で指定した名前のリモートブランチが存在するかチェック
local ARG_BRANCH_NAME=$1
if [ -z "$ARG_BRANCH_NAME" ] ; then
echo "git-branch-test-remote-branch-exists: branch-name"
return 1
fi
local RESULT=$( git branch -a | sed -e 's/^* / /g' | awk '{print $1}' | grep -e '^remotes/origin/'"$ARG_BRANCH_NAME"'$' )
if [ -z "$RESULT" ] ; then
echo "NOTFOUND"
return
fi
echo "FOUND"
}
function git-branch-get-current-branch-name() {
# ローカルのブランチ名を取得する
local RESULT=$( f_git branch -a | grep '^* ' | sed -e 's/* / /g' )
echo $RESULT
}
function git-branch-new() {
#
# 新しいブランチを作成する
# git-branch-new branch-name
#
# 新しいブランチを作成する。 gitユーザー名/#20180417_163658_subbranchname というブランチ名をつける。
# git-branch-new -n subbranchname
#
# 新しいブランチを作成して git add . ; git commit ; git push を一気に行う
# git-branch-new -m "commit message"
#
# 新しいブランチ branch_sub_name を作成して git add . ; git commit ; git push を一気に行う
# git-branch-new -m "commit message" -n branch_sub_name
#
# 新しいブランチ branch_sub_name を作成して git add . ; git commit ; git push ; git tag を一気に行う
# git-branch-new -m "commit message" -n branch_sub_name -t tag_name
#
# GITユーザー名を取得する
local GIT_ID=$( git-user-name )
local YMD_HMS=$( date +%Y%m%d_%H%M%S )
local DEFAULT_BRANCH_NAME="$GIT_ID/#$YMD_HMS"
local BRANCH_NAME=$DEFAULT_BRANCH_NAME
local COMMIT_COMMENT=
local ARG_TAG_LIST=
# 引数解析
while true
do
if [ $# -eq 0 ]; then
break
fi
if [ x"$1"x = x"-m"x ]; then
# -m comment があった場合は、コミットコメントとして採用。pushまで自動で行う。
COMMIT_COMMENT=$2
echo "auto commit mode. commit comment : $COMMIT_COMMENT"
shift
elif [ x"$1"x = x"-n"x ]; then
# -n br-name があった場合、ブランチ名の後ろに付加する
BRANCH_NAME="${DEFAULT_BRANCH_NAME}_$2"
echo "named branch mode. new branch name : $BRANCH_NAME"
shift
elif [ "$1" = "-t" ]; then
# -t tag があった場合は、タグ付けまで自動で行う。
ARG_TAG_LIST="$ARG_TAG_LIST $2"
echo "auto tag mode. tag : $ARG_TAG_LIST"
shift
else
# 引数があった場合はブランチ名として採用
BRANCH_NAME=$1
echo "named branch mode. new branch name : $BRANCH_NAME"
fi
shift
done
echo "create new branch $BRANCH_NAME"
# developに戻す
# f_git checkout develop
# pullする
# f_git pull
# RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# リモートリポジトリでは削除されているブランチは、削除する
f_git fetch --prune
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# ワークの中に未コミットのファイルがあるかチェック
local CHKDURTY=$( git-status-check )
# ローカルブランチが存在するか確認
local CHK_LOCAL_BRANCH=$( git-branch-test-local-branch-exists $BRANCH_NAME )
echo "checking local branch ... CHK_LOCAL_BRANCH=$CHK_LOCAL_BRANCH"
# リモートブランチが存在するか確認
local CHK_REMOTE_BRANCH=$( git-branch-test-remote-branch-exists $BRANCH_NAME )
echo "checking remote branch ... CHK_REMOTE_BRANCH=$CHK_REMOTE_BRANCH"
# 現在のブランチ名とターゲットブランチ名が同じなら、そのまま使う
CURRENT_BRANCH_NAME=$( git-branch-get-current-branch-name )
echo "BRANCH_NAME=$BRANCH_NAME"
echo "CURRENT_BRANCH_NAME=$CURRENT_BRANCH_NAME"
if [ x"$BRANCH_NAME"x = x"$CURRENT_BRANCH_NAME"x ] ; then
echo "current branch is $BRANCH_NAME. use it."
else
if [ x"$CHK_LOCAL_BRANCH"x = x"FOUND"x ] ; then
echo "local branch found. "
# ワーキングに未コミットファイルがある場合、ブランチ変更はできないはず。
if [ x"$CHKDURTY"x = x"DURTY"x ] ; then
echo "WARNING working copy is durty. can not change branch."
fi
# ブランチに切り替え
f_git checkout $BRANCH_NAME
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
elif [ x"$CHK_REMOTE_BRANCH"x = x"FOUND"x ] ; then
echo "remote branch found. "
# ワーキングに未コミットファイルがある場合、ブランチ変更はできないはず。
if [ x"$CHKDURTY"x = x"DURTY"x ] ; then
echo "WARNING working copy is durty. can not change branch."
fi
# ブランチに切り替え
f_git checkout $BRANCH_NAME
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
else
echo "local / remote branch not found. create it."
# branchを新しく作成する
f_git branch $BRANCH_NAME
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# 作成したブランチに切り替え
f_git checkout $BRANCH_NAME
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# 新ブランチは upstream を設定してpush実行
f_git push --set-upstream origin $BRANCH_NAME
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# リモート情報を確認
f_git remote -v
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
fi
fi
# ブランチの一覧を表示
# f_git branch -a
# RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# 現在のステータスを表示
f_git status
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
echo ""
echo " run below commands:"
echo " git add <file> ..."
echo " git commit -m comment"
echo " git push --set-upstream origin $BRANCH_NAME"
echo ""
# コミットコメントがある場合は、add / commit / push まで行う
if [ ! -z "$COMMIT_COMMENT" ]; then
if [ x"$CHKDURTY"x = x"DURTY"x ] ; then
f_git add .
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
f_git commit -m "$COMMIT_COMMENT"
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
fi
# push を実行
f_git push --set-upstream origin $BRANCH_NAME
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
fi
# タグ名付与がある場合はタグ名pushを実行
for i in $ARG_TAG_LIST
do
if [ ! -z "$COMMIT_COMMENT" ]; then
git-branch-tag-and-push -m "$COMMIT_COMMENT" $i
else
git-branch-tag-and-push $i
fi
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
done
}
function git-branch-new-at-tag() {
# 指定されたタグ名の場所にブランチを作成
# git-branch-new-at-tag TAG_NAME_1
# 厳密な意味では、タグ名の場所にブランチを作ることはできないらしい(コミットが一つ進むので)
if [ $# -eq 0 ] ; then
echo "git-branch-new-at-tag tag-name"
return 1
fi
TAG_NAME=$1
BRANCH_NAME=${TAG_NAME}-branch
echo "TAG_NAME is $TAG_NAME"
echo "BRANCH_NAME is $BRANCH_NAME"
# 指定タグをチェックアウト
f_git checkout $TAG_NAME
RC=$? ; if [ $RC -ne 0 ] ; then return 1 ; fi
# その場所に新ブランチを作成
git-branch-new ${BRANCH_NAME}
RC=$? ; if [ $RC -ne 0 ] ; then return 1 ; fi
echo ""
echo "after edit, run git-branch-add -t $TAG_NAME "
echo ""
}
function git-branch-add-auto-tag() {
# 自動でタグ名をつけてコミット
# TEST_IT-20220811-1 みたいなタグを自動で付与してコミットとpushを行う
# git checkout main
TAG_NAME_BASE="TEST_IT-$( date +%Y%m%d )"
CNT=$( git tag | grep "$TAG_NAME_BASE" | wc -l )
CNT=$(( CNT + 1 ))
TAG_NAME="${TAG_NAME_BASE}-${CNT}"
echo "TAG_NAME is $TAG_NAME"
git-branch-add -m "add auto commit with tag $TAG_NAME" -t $TAG_NAME
}
function git-branch-delete() {
# ブランチの削除を実施
# git-branch-delete branch-name
if [ $# -eq 0 ] ; then
echo "git-branch-delete branch-name"
return 1
fi
for BRANCH_NAME in "$@"
do
# local ブランチの削除
f_git branch -d ${BRANCH_NAME}
RC=$? ; if [ $RC -ne 0 ] ; then return 1 ; fi
# remote ブランチの削除
f_git push origin :${BRANCH_NAME}
RC=$? ; if [ $RC -ne 0 ] ; then return 1 ; fi
done
}
# ローカルでtagをつけて、それをpushする
# git tagには -m でメッセージを付けないと git describe で表示時にエラーになる
function git-branch-tag-and-push() {
if [ $# -eq 0 ]; then
echo "git-branch-tag-and-push [-m tag_message] tag-name [tag-name]"
return 1
fi
local ARG_MESSAGE="add tag"
if [ x"$1"x = x"-m"x ]; then
ARG_MESSAGE="$2"
shift
shift
fi
local ARG_TAG
for ARG_TAG in "$@"
do
# 現在のタグ一覧を取得。一致しているものがあったら、削除する。
local CUR_TAG_LIST=$( git tag -l )
local i
for i in $CUR_TAG_LIST ;
do
if [ x"$i"x = x"$ARG_TAG"x ]; then
echo "git-branch-tag-and-push: tag $ARG_TAG is already set."
echo "git-branch-tag-and-push: at first , remove tag $ARG_TAG."
f_git tag -d $ARG_TAG
RC=$? ; if [ $RC -ne 0 ]; then echo "ERROR. abort." ; return 1; fi
f_git push origin :$ARG_TAG
RC=$? ; if [ $RC -ne 0 ]; then echo "ERROR. abort." ; return 1; fi
break
fi
done
# タグをつけて、originにpushする。
f_git tag -m "$ARG_MESSAGE" $ARG_TAG
RC=$? ; if [ $RC -ne 0 ]; then echo "ERROR. abort." ; return 1; fi
f_git push origin $ARG_TAG
RC=$? ; if [ $RC -ne 0 ]; then echo "ERROR. abort." ; return 1; fi
done
}
# ローカルでtagを削除して、それをpushする
function git-branch-tag-remove-and-push() {
if [ $# -eq 0 ]; then
echo "git-branch-tag-remove-and-push tag-name"
return 1
fi
local ARG_TAG=$1
# 現在のタグ一覧を取得。一致しているものがあったら、削除する。
local CUR_TAG_LIST=$( git tag -l )
for i in $CUR_TAG_LIST ;
do
if [ x"$i"x = x"$ARG_TAG"x ]; then
echo "git-branch-tag-remove-and-push: remove tag $ARG_TAG."
f_git tag -d $ARG_TAG
RC=$? ; if [ $RC -ne 0 ]; then echo "ERROR. abort." ; return 1; fi
f_git push origin :$ARG_TAG
RC=$? ; if [ $RC -ne 0 ]; then echo "ERROR. abort." ; return 1; fi
break
fi
done
}
# arg1 から arg2 にマージする
function git-branch-merge() {
local MERGE_MESSAGE="auto merge"
local ARG_SRC
local ARG_DST
local ARG_CNT=0
while true
do
if [ $# -eq 0 ]; then
break
fi
if [ x"$1"x = x"-m"x ]; then
MERGE_MESSAGE=$2
shift
elif [ $ARG_CNT -eq 0 ]; then
ARG_SRC=$1
ARG_CNT=$(( ARG_CNT + 1 ))
elif [ $ARG_CNT -eq 1 ]; then
ARG_DST=$1
ARG_CNT=$(( ARG_CNT + 1 ))
fi
shift
done
if [ -z "$ARG_SRC" -o -z "$ARG_DST" ] ; then
echo "git-branch-merge develop master ... merge develop into master"
return 1
fi
# pullする
f_git pull
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# masterをチェックアウトする
f_git checkout $ARG_DST
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# pullする
f_git pull
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# developをマージする
f_git merge -m "$MERGE_MESSAGE" $ARG_SRC
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# commitする
#f_git commit -m "merge from develop"
#RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# pushする
f_git push
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# developをチェックアウトする
#f_git checkout $ARG_SRC
#RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# 状態表示
f_git status
}
# 現在のブランチに対して本家の進捗を取り込んでマージする
function git-branch-fetch-and-merge() {
local MERGE_MESSAGE="automatic merge from origin"
local ARG_SRC
local ARG_CNT=0
while true
do
if [ $# -eq 0 ]; then
break
fi
if [ x"$1"x = x"-m"x ]; then
MERGE_MESSAGE=$2
shift
elif [ $ARG_CNT -eq 0 ]; then
ARG_SRC=$1
ARG_CNT=$(( ARG_CNT + 1 ))
fi
shift
done
if [ -z "$ARG_SRC" ] ; then
echo "git-branch-fetch-and-merge master ... merge from master into current branch"
return 1
fi
f_git fetch
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# master or main からマージする
f_git merge -m "$MERGE_MESSAGE" origin $ARG_SRC
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
# 状態表示
f_git status
}
# 現在のブランチに対してstash push -u してからgit pullしてstash popする
function git-branch-pull-stash() {
local GIT_STATUS=$( git-status-check )
if [ x"$GIT_STATUS"x = x"DURTY"x ]; then
f_git stash push -u
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
f_git pull
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
f_git stash pop
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
else
f_git pull
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
fi
}
# コミットしてpushする
function git-branch-add() {
local COMMIT_COMMENT=
local ARG_TAG_LIST=
# 引数解析
if [ $# -eq 0 ]; then
echo "git-branch-add [-m commit-comment ] [ -t tag ]"
return 1
fi
# 引数解析
while true
do
if [ $# -eq 0 ]; then
break
fi
if [ "$1" = "-m" ]; then
# -m comment があった場合は、コミットコメントとして採用。pushまで自動で行う。
COMMIT_COMMENT=$2
echo "auto commit mode. commit comment : $COMMIT_COMMENT"
shift
fi
if [ "$1" = "-t" ]; then
# -t tag があった場合は、タグ付けまで自動で行う。
ARG_TAG_LIST="$ARG_TAG_LIST $2"
echo "auto tag mode. tag : $ARG_TAG_LIST"
shift
fi
shift
done
f_git diff
f_git status
local GIT_STATUS=$( git-status-check )
if [ x"$GIT_STATUS"x = x"DURTY"x ]; then
f_git add .
if [ -z "$COMMIT_COMMENT" ]; then
return 0
fi
f_git commit -m "$COMMIT_COMMENT"
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
f_git push
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
fi
for i in $ARG_TAG_LIST
do
if [ -n "$COMMIT_COMMENT" ] ; then
git-branch-tag-and-push -m "$COMMIT_COMMENT" $i
else
git-branch-tag-and-push $i
fi
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
done
}
#
# 1コミットの内容だけを他のブランチで取り込みたい場合
#
function git-branch-cherry-pick() {
local COMMIT_IDS="$@"
if [ -z "$COMMIT_IDS" ]; then
echo "git-branch-cherry-pick commit-id1 [commit-id2...]"
return 0
fi
git cherry-pick --allow-empty "$COMMIT_IDS"
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
}
#
# git pull --rebase=true を実施する (非推奨)
#
# master 上で変更された内容を手元に取り込み、 merge commit を作らずにmergeを実施する。
#
# git pull のデフォルトでは、merge commit を作成する。
#
function git-branch-deprecated-pull-rebase-true() {
echo "git-branch-pull-rebase-true is deprecated."
echo "use git-branch-fetch-and-merge."
local GIT_STATUS=$( git-status-check )
if [ x"$GIT_STATUS"x = x"DURTY"x ]; then
f_git add .
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
f_git commit -m "for prepair merge"
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
fi
f_git pull --rebase=true
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
}
#
# git sparse checkout を行う。git 2.25以降。巨大gitプロジェクトの中から一部のディレクトリだけ取り出す。
#
# git-branch-sparse-checkout http://hoge.git.com/user/proj.git dir-name-1
#
# git-branch-sparse-checkout -t tag-name http://hoge.git.com/user/proj.git dir-name-1 [dir-name-2]
#
function git-branch-sparse-checkout() {
local ARG_GITURL=$1
local ARG_PATH_LIST=
local ARG_TAG_NAME=
local ARG_CNT=0
local USAGE_MSG="git-branch-sparse-checkout [-t tag-name] git-url path-1 [path-2...]"
while true
do
if [ $# -eq 0 ] ; then
break
fi
if [ x"$1"x = x"--help"x ] ; then
echo "$USAGE_MSG"
return 1
elif [ x"$1"x = x"-t"x ] ; then
ARG_TAG_NAME="$2"
shift
elif [ $ARG_CNT -eq 0 ] ; then
ARG_GITURL=$1
ARG_CNT=$(( ARG_CNT + 1 ))
elif [ $ARG_CNT -gt 0 ] ; then
ARG_PATH_LIST="$ARG_PATH_LIST $1"
ARG_CNT=$(( ARG_CNT + 1 ))
fi
shift
done
if [ -z "$ARG_GITURL" ] ; then
echo "$USAGE_MSG"
return 1
fi
git clone --filter=blob:none $ARG_GITURL
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
local PROJ_SUBDIR=${ARG_GITURL##*/}
local PROJ_DIR=${PROJ_SUBDIR%%.git}
pushd $PROJ_DIR
git sparse-checkout init
git sparse-checkout set $ARG_PATH_LIST
# タグ名指定があるなら、指定してチェックアウト実施
git checkout $ARG_TAG_NAME
popd
}
#
# 「ええーいリモートが合ってるんだからアイツに合わせたいんだよ!」
# とイライラしたら下記。
#
function git-branch-force-master-pull() {
f_git checkout master
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
f_git fetch origin
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
f_git reset --hard origin/master
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
}
function git-branch-force-main-pull() {
f_git checkout main
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
f_git fetch origin
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
f_git reset --hard origin/main
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
}
#
# git stash 系のコマンド
#
# workspace上の未追跡ファイルも含めて一時的に退避する。gitワークスペースはcleanな状態になる。
function git-stash-push-u() {
COMMENT="stash saved $(date)"
if [ $# -gt 0 ] ; then
COMMENT="$1"
fi
f_git stash push -u -m "$COMMENT"
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
}
# stashから戻す。使用したstashは消す。
function git-stash-pop() {
f_git stash pop
RC=$? ; if [ $RC -ne 0 ]; then return 1; fi
}
# stashの一覧
function git-stash-list() {
f_git stash list
}
# stashの内容表示
function git-stash-show() {
f_git stash show
}
# stashから戻す。popと異なり使用したstashは消さない。
function git-stash-apply() {
if [ $# -eq 0 ] ; then
echo "ex: git-stash-apply 0"
return 0
fi
f_git stash apply "stash@{$1}"
}
# 指定した番号のstashを消す
function git-stash-drop() {
if [ $# -eq 0 ] ; then
echo "ex: git-stash-drop 0"
return 0
fi
f_git stash drop "stash@{$1}"
}
# 全てのstashを消す
function git-stash-clear() {
f_git stash clear
}
#
# git backup 系のコマンド
#
# カレントディレクトリ名 + _bkup の名前の一つ上のディレクトリに modified ファイルと untrack ファイルをコピーして保存する
function git-branch-private-backup-upper-dir() {
if [ $# -eq 0 ] ; then
echo "git-branch-private-backup-upper-dir: filename"
return 1
fi
FROM="$1"
if [ $# -ge 2 ] ; then
DEST_DIR="$2"
else
DEST_DIR="../$( basename $PWD )_bkup"
fi
if [ ! -f "$FROM" ] ; then
echo "git-branch-private-backup-upper-dir: $FROM is not a file"
return 1
fi
DEST="$DEST_DIR/$FROM"
# echo "DEST is $DEST"
DIR=$( dirname $DEST )
# echo "DIR is $DIR"
# echo mkdir -p $DIR
mkdir -p $DIR
RC=$? ; if [ $RC -ne 0 ] ; then echo "ERROR. abort." ; return 1 ; fi
echo cp $FROM $DEST
cp $FROM $DEST
RC=$? ; if [ $RC -ne 0 ] ; then echo "ERROR. abort." ; return 1 ; fi
}
# git status の結果から modified ファイルと untracked ファイルの一覧を取得する
function git-branch-list-modified-untrack-files() {
MODIFIED_LIST=$( git status | awk '/modified:/{print $2;}' )
UNTRACKED_LIST=$( git status | awk '/Untracked/ { F1 = 1; }; ( F1 == 1 ) { print $0; }' | grep -v "Untracked files" | grep -v "to include in what will be committed" | grep -v "no changes added to commit" | awk '{print $1}' )
for i in $MODIFIED_LIST $UNTRACKED_LIST
do
echo $i
done
}
# 一つ上のディレクトリに modified ファイルと untrack ファイルをコピーして保存する
function git-branch-backup-modified-untrack-files() {
MODIFIED_UNTRACK_LIST=$( git-branch-list-modified-untrack-files )
YMD_HMS=$( date +%Y%m%d_%H%M%S)
DEST_DIR="../$( basename $PWD )_bkup_${YMD_HMS}"
for i in $MODIFIED_UNTRACK_LIST
do
git-branch-private-backup-upper-dir "$i" "$DEST_DIR"
RC=$? ; if [ $RC -ne 0 ] ; then echo "ERROR. abort." ; return 1 ; fi
done
}
#
# end of file
#
コマンドライン引数に指定された文字列をウィンドウ表示する PowerShell
#
# コマンドライン引数に指定された文字列をウィンドウ表示する PowerShell
#
# 2024.12.07
#
function f-echo {
# 引数補正 外部から$argsを渡された場合
if ( $args.gettype().name -eq "Object[]" ) {
if ( $args.length -ge 1 ) {
if ( $args[0].gettype().name -eq "Object[]" ) {
$args = $args[0]
}
}
}
# 引数が指定されていない場合、エラーメッセージを表示して終了
if (-not $args[0]) {
Write-Host "使用方法: ps1-echo.ps1 <表示する文字列>"
return 1
}
# コマンドライン引数から文字列を取得
$textToDisplay = ""
# 引数解析
while ( $args.length -gt 0 ) {
# get first arg and shift
$a1, $args = $args;
$a2, $rest = $args;
$textToDisplay += $a1 + " ";
}
# 必要なアセンブリを読み込む
Add-Type -AssemblyName PresentationCore, PresentationFramework
# WPF ウィンドウを作成
$window = New-Object System.Windows.Window
$window.Title = "文字列コピー"
$window.Width = 500
$window.Height = 350
$window.WindowStartupLocation = "CenterScreen"
# StackPanel (レイアウト) を作成
$stackPanel = New-Object System.Windows.Controls.StackPanel
$stackPanel.Margin = "10"
# テキストエリア (スクロール可能なテキストボックス) を作成
$textArea = New-Object System.Windows.Controls.TextBox
$textArea.Text = $textToDisplay
$textArea.Margin = "0,0,0,10"
$textArea.HorizontalAlignment = "Stretch"
$textArea.VerticalAlignment = "Stretch"
$textArea.AcceptsReturn = $true
$textArea.TextWrapping = "Wrap"
$textArea.VerticalScrollBarVisibility = "Auto"
$textArea.IsReadOnly = $true
$textArea.Height = 150
$textArea.SelectAll()
# メッセージエリア (コピー完了メッセージを表示するラベル) を作成
$messageArea = New-Object System.Windows.Controls.TextBlock
$messageArea.Text = ""
$messageArea.Margin = "0,10,0,10"
$messageArea.HorizontalAlignment = "Center"
$messageArea.TextAlignment = "Center"
$messageArea.Foreground = [System.Windows.Media.Brushes]::Green
$messageArea.FontSize = 14
# ボタンを作成
$button = New-Object System.Windows.Controls.Button
$button.Content = "クリップボードにコピー"
$button.Width = 200
$button.HorizontalAlignment = "Center"
# ボタンのクリックイベントを定義
$button.Add_Click({
Add-Type -AssemblyName PresentationCore
[System.Windows.Clipboard]::SetText($textArea.Text)
$messageArea.Text = "文字列がクリップボードにコピーされました!"
})
# レイアウトに要素を追加
$stackPanel.Children.Add($textArea)
$stackPanel.Children.Add($button)
$stackPanel.Children.Add($messageArea)
# ウィンドウにレイアウトを設定
$window.Content = $stackPanel
# ウィンドウを表示
$window.ShowDialog()
return
}
f-echo $args
#
# end of file
#
Windows 11 初期設定
メモリが足りないマシンでの設定。