Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c612c6c762 | |||
| 3265d75b7d | |||
| 50f53d3a35 | |||
| 4fc2c7f009 |
25
README.md
25
README.md
@@ -48,12 +48,14 @@ create_ssh_config.sh [repo url full] ([jump proxy])
|
||||
Create a new clone
|
||||
|
||||
```sh
|
||||
new_clone.sh [repository] [branch] ([host]) ([remote name])
|
||||
new_clone.sh -r <Repository URL> -b <Branch Name> [-H <Host name>] [-f <Folder name>] [-n <Remote name>]
|
||||
```
|
||||
|
||||
The [host] is the SSH Host name entry, this will replace any "[host]:" in the [repository]. If the [host] is not set the host set in the [repository] will be used. If nothing found the script will abort
|
||||
The [host (-H)] is the SSH Host name entry, this will replace any "[host]:" in the [repository]. If the [host (-H)] is not set the host set in the [repository] will be used. If nothing found the script will abort. Note that if [host (-H)] is not set the host name will be the Repository name which has to match the SSH config setting.
|
||||
|
||||
A [branch] name must be set all the time.
|
||||
A [branch (-B)] name must be set all the time.
|
||||
|
||||
An override folder naem can be set with `-f`
|
||||
|
||||
An optional [remote name] can be set, if not set "origin" will be used.
|
||||
|
||||
@@ -82,6 +84,23 @@ Sample
|
||||
[2025-07-04 16:06:31] [<uniq id>] [END]
|
||||
```
|
||||
|
||||
#### What happens to local changes
|
||||
|
||||
Any local changes are stored in a backup branch and then reset and cleaned up. No local changes should be commited or synced up, this would break the pull only flow.
|
||||
|
||||
If there are changes and they have been reset it will show up in the log like this
|
||||
|
||||
```log
|
||||
...
|
||||
[2026-01-22 14:31:02] [F4222EC4] [!] Local or cached changes detected, creating backup branch and resetting changes
|
||||
[2026-01-22 14:31:02] [F4222EC4] Reset log: HEAD is now at 633f6de Uppdate 14
|
||||
...
|
||||
```
|
||||
|
||||
If a clean up was run too it will show up as "Clean log" after the Reset log.
|
||||
|
||||
The reset will only reset local or cached changs (added) but not changed that have been commited. If changes have been commited a manual reset has to be done.
|
||||
|
||||
## TODO
|
||||
|
||||
Future versions will hold an incoming webhook handler and a polling scripts (systemd based)
|
||||
|
||||
@@ -33,9 +33,28 @@ GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" "fetch" "-
|
||||
"${GIT_COMMAND[@]}"
|
||||
# check diff for if we need to update
|
||||
GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" "diff" "--stat" "HEAD" "${REMOTE_NAME}/${BRANCH}")
|
||||
# In general all data that should not be checked in should be in the .gitignore file
|
||||
changes=$("${GIT_COMMAND[@]}" 2>&1)
|
||||
if [ -n "${changes}" ]; then
|
||||
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [${unique_id}] [START] git merge ${GIT_REPOSITORY_FOLDER} ${REMOTE_NAME}/${BRANCH}" &>> "$LOG_FILE";
|
||||
# check if there are local changes, make a backup branch and reset them
|
||||
local_changes=$("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" "diff" "--quiet");
|
||||
cached_changed=$("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" "diff" "--quiet" "--cached");
|
||||
if $local_changes || $cached_changed; then
|
||||
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [${unique_id}] [!] Local or cached changes detected, creating backup branch and resetting changes" &>> "$LOG_FILE";
|
||||
GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" "branch" "backup-$(date +%Y%m%d-%H%M%S)")
|
||||
"${GIT_COMMAND[@]}";
|
||||
# Reset everything
|
||||
GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" "reset" "--hard" "HEAD")
|
||||
log_data=$("${GIT_COMMAND[@]}" 2>&1);
|
||||
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [${unique_id}] Reset log: ${log_data}" &>> "$LOG_FILE";
|
||||
GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" "clean" "-fd")
|
||||
log_data=$("${GIT_COMMAND[@]}" 2>&1);
|
||||
if [ -n "${log_data}" ]; then
|
||||
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [${unique_id}] Clean log: ${log_data}" &>> "$LOG_FILE";
|
||||
fi;
|
||||
fi;
|
||||
# MERGE
|
||||
GIT_COMMAND=("${GIT_COMMAND_BASE[@]}" "-C" "${GIT_REPOSITORY_FOLDER}" merge "${REMOTE_NAME}/${BRANCH}")
|
||||
log_data=$("${GIT_COMMAND[@]}" 2>&1);
|
||||
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [${unique_id}] ${log_data}" &>> "$LOG_FILE";
|
||||
|
||||
@@ -6,15 +6,99 @@
|
||||
|
||||
# COMMAND: new_clone.sh <Repo.git> <branch> [<host>] [<Repo Target Name>] [<remote name>]
|
||||
|
||||
REPOSITORY="$1";
|
||||
BRANCH="$2";
|
||||
REMOTE_HOST="$3";
|
||||
REPOSITORY_FOLDER="$4"
|
||||
REMOTE_NAME="$5";
|
||||
if [ "${REPOSITORY}" == "--help" ]; then
|
||||
echo "$0 <Repo.git> <branch> [<override host>] [<target folder>] [<remote name, defaults to origin>]";
|
||||
|
||||
function error() {
|
||||
if [ -t 1 ]; then echo "[MAK] ERROR: $*" >&2; fi; exit 0;
|
||||
}
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
Usage: $(basename "${BASH_SOURCE[0]}") [-h | --help] -r | --repository <Repository URL> -b | --branch <Branch Name> [-H | --host <Host name>] [-f | --folder <Folder name>] [-n | --remote <Remote name>]
|
||||
|
||||
New clone a git repository via ssh into the clone folder.
|
||||
|
||||
Available options:
|
||||
|
||||
-h, --help Print this help and exit
|
||||
-r, --repository <Repository URL> Repository path (e.g. user/repo.git)
|
||||
-b, --branch <Branch Name> Branch to clone (e.g. main)
|
||||
-H, --host <Host name> Override SSH host from ssh config (e.g. my-ssh-host)
|
||||
-f, --folder <Folder name> Target folder name for the repository (e.g. repo-name)
|
||||
-n, --remote <Remote name> Remote name (defaults to origin)
|
||||
|
||||
EOF
|
||||
exit
|
||||
}
|
||||
|
||||
# REPOSITORY="$1";
|
||||
# BRANCH="$2";
|
||||
# REMOTE_HOST="$3";
|
||||
# REPOSITORY_FOLDER="$4"
|
||||
# REMOTE_NAME="$5";
|
||||
# if [ "${REPOSITORY}" == "--help" ]; then
|
||||
# echo "$0 <Repo.git> <branch> [<override host>] [<target folder>] [<remote name, defaults to origin>]";
|
||||
# exit;
|
||||
# fi;
|
||||
REPOSITORY="";
|
||||
BRANCH="";
|
||||
REMOTE_HOST="";
|
||||
REPOSITORY_FOLDER="";
|
||||
REMOTE_NAME="origin";
|
||||
while [ -n "${1-}" ]; do
|
||||
case "${1}" in
|
||||
-r | --repository)
|
||||
REPOSITORY="${2-}";
|
||||
shift
|
||||
;;
|
||||
-b | --branch)
|
||||
BRANCH="${2-}";
|
||||
shift
|
||||
;;
|
||||
-H | --host)
|
||||
REMOTE_HOST="${2-}";
|
||||
shift
|
||||
;;
|
||||
-f | --folder)
|
||||
REPOSITORY_FOLDER="${2-}";
|
||||
shift
|
||||
;;
|
||||
-n | --remote)
|
||||
REMOTE_NAME="${2-}";
|
||||
shift
|
||||
;;
|
||||
-h | --help)
|
||||
usage
|
||||
;;
|
||||
# invalid option
|
||||
-?*)
|
||||
error "[!] Unknown option: '$1'."
|
||||
;;
|
||||
esac
|
||||
shift;
|
||||
done;
|
||||
|
||||
# if no repository or banch name given, show error
|
||||
error=0
|
||||
if [ -z "${REPOSITORY}" ]; then
|
||||
echo "[!] Must set a repository full url, ssh only";
|
||||
error=1;
|
||||
fi;
|
||||
if [ -z "${BRANCH}" ]; then
|
||||
echo "[!] Must set a branch name";
|
||||
error=1;
|
||||
fi;
|
||||
# further checks that repository folder if set can only by alphanumeric, -, _ or .
|
||||
if [ -n "${REPOSITORY_FOLDER}" ]; then
|
||||
if ! [[ "${REPOSITORY_FOLDER}" =~ ^[a-zA-Z0-9._-]+$ ]]; then
|
||||
echo "[!] Repository folder name can only contain alphanumeric characters, dots, dashes or underscores";
|
||||
error=1;
|
||||
fi;
|
||||
fi;
|
||||
|
||||
if [ $error -eq 1 ]; then
|
||||
exit;
|
||||
fi;
|
||||
|
||||
if [ -z "${REMOTE_NAME}" ]; then
|
||||
REMOTE_NAME="origin"
|
||||
fi;
|
||||
@@ -38,7 +122,7 @@ else
|
||||
fi;
|
||||
# set remote host if not set to the ssh config name
|
||||
if [ -z "${REMOTE_HOST}" ]; then
|
||||
REMOTE_HOST="${GIT_REPOSITORY_NAME}";
|
||||
REMOTE_HOST="$(basename "${REPOSITORY}" .git)";
|
||||
fi;
|
||||
if [ $error -eq 1 ]; then
|
||||
exit;
|
||||
@@ -47,7 +131,7 @@ fi;
|
||||
error=0
|
||||
echo "* Validate SSH PEM Key exist and SSH config";
|
||||
if ! grep "Host ${REMOTE_HOST}" "${GIT_WEBHOOK_BASE_FOLDER}"/.ssh/config; then
|
||||
echo "[!] ssh config entry for Host ${REMOTE_HOST} is missing";
|
||||
echo "[!] ssh config entry for Host ${REMOTE_HOST} is missing in ${GIT_WEBHOOK_BASE_FOLDER}/.ssh/config";
|
||||
error=1;
|
||||
else
|
||||
# make sure the identiy file is there
|
||||
|
||||
Reference in New Issue
Block a user