Skip to content

Instantly share code, notes, and snippets.

@t-botz
Created March 30, 2020 09:34
Show Gist options
  • Save t-botz/fc1485e8e07e8900caf5b55e1d63e399 to your computer and use it in GitHub Desktop.
Save t-botz/fc1485e8e07e8900caf5b55e1d63e399 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
set -eux
# Can accept arg for target dir, otherwise this script dir
target_dir="$( cd "${1:-$(dirname "${BASH_SOURCE[0]}")}" >/dev/null 2>&1 && pwd )"
pushd "$target_dir"
for repo in "main_repo" "repoA" "repoB"
do
mkdir $repo
pushd "$repo"
git init
filename="$repo.file.txt"
echo "$repo bla bla" > "$filename"
git add "$filename"
git commit -m "Add file $filename"
popd
done
pushd main_repo
git remote add repoA "$target_dir/repoA"
git remote add repoB "$target_dir/repoB"
git fetch --all
git merge -sours --allow-unrelated-histories --all --no-commit repoA/master repoB/master
git read-tree --prefix=modules/a -u repoA/master
git read-tree --prefix=modules/b -u repoB/master
git commit -m "Merge repoA and repoB"
git log -- modules/a/repoA.file.txt
git log --follow -- modules/a/repoA.file.txt
git log --full-history -- repoA.file.txt
popd
popd
@t-botz
Copy link
Author

t-botz commented Mar 30, 2020

Full Output here:

$ ./create-repos.sh 
+++ dirname ./create-repos.sh
++ cd .
++ pwd
+ target_dir=/Users/delorth/projects/git-merge-repo-log
+ pushd /Users/delorth/projects/git-merge-repo-log
~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ for repo in '"main_repo"' '"repoA"' '"repoB"'
+ mkdir main_repo
+ pushd main_repo
~/projects/git-merge-repo-log/main_repo ~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ git init
Initialized empty Git repository in /Users/delorth/projects/git-merge-repo-log/main_repo/.git/
+ filename=main_repo.file.txt
+ echo 'main_repo bla bla'
+ git add main_repo.file.txt
+ git commit -m 'Add file main_repo.file.txt'
[master (root-commit) c2f1981] Add file main_repo.file.txt
 1 file changed, 1 insertion(+)
 create mode 100644 main_repo.file.txt
+ popd
~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ for repo in '"main_repo"' '"repoA"' '"repoB"'
+ mkdir repoA
+ pushd repoA
~/projects/git-merge-repo-log/repoA ~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ git init
Initialized empty Git repository in /Users/delorth/projects/git-merge-repo-log/repoA/.git/
+ filename=repoA.file.txt
+ echo 'repoA bla bla'
+ git add repoA.file.txt
+ git commit -m 'Add file repoA.file.txt'
[master (root-commit) a523a9f] Add file repoA.file.txt
 1 file changed, 1 insertion(+)
 create mode 100644 repoA.file.txt
+ popd
~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ for repo in '"main_repo"' '"repoA"' '"repoB"'
+ mkdir repoB
+ pushd repoB
~/projects/git-merge-repo-log/repoB ~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ git init
Initialized empty Git repository in /Users/delorth/projects/git-merge-repo-log/repoB/.git/
+ filename=repoB.file.txt
+ echo 'repoB bla bla'
+ git add repoB.file.txt
+ git commit -m 'Add file repoB.file.txt'
[master (root-commit) 69b98ce] Add file repoB.file.txt
 1 file changed, 1 insertion(+)
 create mode 100644 repoB.file.txt
+ popd
~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ pushd main_repo
~/projects/git-merge-repo-log/main_repo ~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ git remote add repoA /Users/delorth/projects/git-merge-repo-log/repoA
+ git remote add repoB /Users/delorth/projects/git-merge-repo-log/repoB
+ git fetch --all
Fetching repoA
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 216 bytes | 13.00 KiB/s, done.
From /Users/delorth/projects/git-merge-repo-log/repoA
 * [new branch]      master     -> repoA/master
Fetching repoB
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 216 bytes | 15.00 KiB/s, done.
From /Users/delorth/projects/git-merge-repo-log/repoB
 * [new branch]      master     -> repoB/master
+ git merge -sours --allow-unrelated-histories --all --no-commit repoA/master repoB/master
Automatic merge went well; stopped before committing as requested
+ git read-tree --prefix=modules/a -u repoA/master
+ git read-tree --prefix=modules/b -u repoB/master
+ git commit -m 'Merge repoA and repoB'
[master 08dcb66] Merge repoA and repoB
+ popd
~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ git log -- modules/a/repoA.file.txt
fatal: not a git repository (or any of the parent directories): .git
C02VF0RCG8WL:git-merge-repo-log delorth$ rm -rf main_repo/ repoA/ repoB
C02VF0RCG8WL:git-merge-repo-log delorth$ ./create-repos.sh 
+++ dirname ./create-repos.sh
++ cd .
++ pwd
+ target_dir=/Users/delorth/projects/git-merge-repo-log
+ pushd /Users/delorth/projects/git-merge-repo-log
~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ for repo in '"main_repo"' '"repoA"' '"repoB"'
+ mkdir main_repo
+ pushd main_repo
~/projects/git-merge-repo-log/main_repo ~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ git init
Initialized empty Git repository in /Users/delorth/projects/git-merge-repo-log/main_repo/.git/
+ filename=main_repo.file.txt
+ echo 'main_repo bla bla'
+ git add main_repo.file.txt
+ git commit -m 'Add file main_repo.file.txt'
[master (root-commit) 2ea5bd4] Add file main_repo.file.txt
 1 file changed, 1 insertion(+)
 create mode 100644 main_repo.file.txt
+ popd
~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ for repo in '"main_repo"' '"repoA"' '"repoB"'
+ mkdir repoA
+ pushd repoA
~/projects/git-merge-repo-log/repoA ~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ git init
Initialized empty Git repository in /Users/delorth/projects/git-merge-repo-log/repoA/.git/
+ filename=repoA.file.txt
+ echo 'repoA bla bla'
+ git add repoA.file.txt
+ git commit -m 'Add file repoA.file.txt'
[master (root-commit) f3ff341] Add file repoA.file.txt
 1 file changed, 1 insertion(+)
 create mode 100644 repoA.file.txt
+ popd
~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ for repo in '"main_repo"' '"repoA"' '"repoB"'
+ mkdir repoB
+ pushd repoB
~/projects/git-merge-repo-log/repoB ~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ git init
Initialized empty Git repository in /Users/delorth/projects/git-merge-repo-log/repoB/.git/
+ filename=repoB.file.txt
+ echo 'repoB bla bla'
+ git add repoB.file.txt
+ git commit -m 'Add file repoB.file.txt'
[master (root-commit) 607766d] Add file repoB.file.txt
 1 file changed, 1 insertion(+)
 create mode 100644 repoB.file.txt
+ popd
~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ pushd main_repo
~/projects/git-merge-repo-log/main_repo ~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ git remote add repoA /Users/delorth/projects/git-merge-repo-log/repoA
+ git remote add repoB /Users/delorth/projects/git-merge-repo-log/repoB
+ git fetch --all
Fetching repoA
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 216 bytes | 15.00 KiB/s, done.
From /Users/delorth/projects/git-merge-repo-log/repoA
 * [new branch]      master     -> repoA/master
Fetching repoB
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 217 bytes | 13.00 KiB/s, done.
From /Users/delorth/projects/git-merge-repo-log/repoB
 * [new branch]      master     -> repoB/master
+ git merge -sours --allow-unrelated-histories --all --no-commit repoA/master repoB/master
Automatic merge went well; stopped before committing as requested
+ git read-tree --prefix=modules/a -u repoA/master
+ git read-tree --prefix=modules/b -u repoB/master
+ git commit -m 'Merge repoA and repoB'
[master b4ec601] Merge repoA and repoB
+ git log -- modules/a/repoA.file.txt
commit b4ec601bc4aa9538aca7e004ddc0ae8a81d4b947 (HEAD -> master)
Merge: 2ea5bd4 f3ff341 607766d
Author: Tibo <xxxxxx>
Date:   Mon Mar 30 20:29:56 2020 +1100

    Merge repoA and repoB
+ git log --follow -- modules/a/repoA.file.txt
+ git log --full-history -- repoA.file.txt
commit b4ec601bc4aa9538aca7e004ddc0ae8a81d4b947 (HEAD -> master)
Merge: 2ea5bd4 f3ff341 607766d
Author: Tibo <xxxxx>
Date:   Mon Mar 30 20:29:56 2020 +1100

    Merge repoA and repoB

commit f3ff341f26702457d7787cb793605b6509dd4ff8 (repoA/master)
Author: Tibo <xxxxxx>
Date:   Mon Mar 30 20:29:56 2020 +1100

    Add file repoA.file.txt
+ popd
~/projects/git-merge-repo-log ~/projects/git-merge-repo-log
+ popd
~/projects/git-merge-repo-log

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment