Files
git.taskfile.build/bin/merge-git-remote
T
Janik von Rotz fa48eda0c0 feat(aliases): implement first-letter shorthand aliases for all bin scripts with collision handling
- Added alias functions to all bin scripts using first-letter pattern (e.g., `av` for `activate-venv`, `cwl` for `commit-with-llm`)
- Implemented collision resolution by extending aliases with additional letters when conflicts occur or when shadowing standard shell commands
- Documented alias implementation approach in library.md with complete alias map for reference
- Verified shell syntax with `bash -n` and ensured proper argument passing with `"$@"`
- Updated prompt frontmatter to reflect completed state and model used (infomaniak/moonshotai/Kimi-K2.6)
2026-07-08 15:42:22 +02:00

70 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
merge-git-remote() {
local git_folders
git_folders=$(ls-git-folder .)
for git_folder in $git_folders; do
git_folder="${git_folder#./}"
if ! git config -f .gitmodules --get-regexp "merge\.$git_folder\." &>/dev/null; then
continue
fi
echo "=== Processing submodule: $git_folder ==="
# Add explicit remotes from [remotes] section
while IFS= read -r line; do
local key value remote_name
key=$(echo "$line" | awk '{print $1}')
value=$(echo "$line" | awk '{print $2}')
remote_name="${key##remotes.$git_folder.}"
echo "Adding remote '$remote_name' -> $value"
git -C "$git_folder" remote add "$remote_name" "$value" 2>/dev/null || \
git -C "$git_folder" remote set-url "$remote_name" "$value"
git -C "$git_folder" fetch -q "$remote_name"
done < <(git config -f .gitmodules --get-regexp "remotes\.$git_folder\." 2>/dev/null)
local pinned_commit
pinned_commit=$(git config -f .gitmodules submodule."$git_folder".commit 2>/dev/null)
if [[ -n "$pinned_commit" ]]; then
git -C "$git_folder" checkout -q -B merged "$pinned_commit"
else
git -C "$git_folder" checkout -q -B merged HEAD
fi
# Fetch origin once upfront for any origin merge refs
if git config -f .gitmodules --get-regexp "merge\.$git_folder\.origin" &>/dev/null; then
git -C "$git_folder" fetch -q origin
fi
# Fetch the refs from remote
while IFS= read -r line; do
local key merge_ref remote_name tmp_ref
key=$(echo "$line" | awk '{print $1}')
merge_ref=$(echo "$line" | awk '{print $2}')
remote_name="${key##merge.$git_folder.}"
tmp_ref="refs/merge-tmp/${remote_name}-$(echo "$merge_ref" | tr '/' '-')"
echo "Fetch ref $merge_ref from $remote_name"
git -C "$git_folder" fetch --force "$remote_name" "$merge_ref:$tmp_ref"
done < <(git config -f .gitmodules --get-regexp "merge\.$git_folder\.")
# Merge refs into merge branch
while IFS= read -r line; do
local key merge_ref remote_name tmp_ref
key=$(echo "$line" | awk '{print $1}')
merge_ref=$(echo "$line" | awk '{print $2}')
remote_name="${key##merge.$git_folder.}"
echo "Merging ref $merge_ref"
tmp_ref="refs/merge-tmp/${remote_name}-$(echo "$merge_ref" | tr '/' '-')"
if ! git -C "$git_folder" merge -q --no-edit "$tmp_ref"; then
echo " !! Merge conflict in $git_folder ($remote_name/$merge_ref) — resolve manually"
fi
done < <(git config -f .gitmodules --get-regexp "merge\.$git_folder\.")
done
}
mgr() {
merge-git-remote "$@"
}