feat: completely rewrite GitHub mirror to create new history from target commit
BREAKING: This completely replaces the previous approach and will DELETE
all existing history on GitHub, creating entirely new commit SHAs.
Key changes:
- Use orphan branch instead of cherry-pick to break history connection
- Create initial commit from target commit tree using git read-tree
- Apply subsequent changes as completely new commits with new SHAs
- Force push will COMPLETELY REPLACE GitHub history
- No trace of commits before 7aca927937 will remain on GitHub
This ensures GitHub shows only history from the target commit onwards
with no connection to previous commits or their metadata.
This commit is contained in:
@@ -31,7 +31,7 @@ jobs:
|
|||||||
echo "Checking target commit exists:"
|
echo "Checking target commit exists:"
|
||||||
git show --oneline 7aca927937 || echo "Target commit not found!"
|
git show --oneline 7aca927937 || echo "Target commit not found!"
|
||||||
|
|
||||||
- name: Create filtered history from specific commit
|
- name: Create completely new history from specific commit
|
||||||
run: |
|
run: |
|
||||||
TARGET_COMMIT="7aca927937"
|
TARGET_COMMIT="7aca927937"
|
||||||
|
|
||||||
@@ -46,66 +46,69 @@ jobs:
|
|||||||
# Clean up any existing github-mirror branch
|
# Clean up any existing github-mirror branch
|
||||||
git branch -D github-mirror || true
|
git branch -D github-mirror || true
|
||||||
|
|
||||||
# Create a new branch starting from the target commit
|
# Create a completely new orphan branch (no history)
|
||||||
git checkout -b github-mirror $TARGET_COMMIT
|
git checkout --orphan github-mirror
|
||||||
|
|
||||||
echo "Created github-mirror branch from commit $TARGET_COMMIT"
|
# Clear the staging area completely
|
||||||
echo "Current commit: $(git log --oneline -1)"
|
git rm -rf . || true
|
||||||
|
|
||||||
# Get all commits from target commit to current main (excluding merge commits)
|
# Get the file tree from the target commit and create initial commit
|
||||||
echo "Getting non-merge commits from $TARGET_COMMIT to main..."
|
echo "Creating new history starting from $TARGET_COMMIT..."
|
||||||
COMMITS_TO_APPLY=$(git rev-list --reverse --no-merges $TARGET_COMMIT..main)
|
git read-tree $TARGET_COMMIT
|
||||||
|
git commit -m "Initial commit - imported from $(git log --oneline -1 $TARGET_COMMIT)"
|
||||||
|
|
||||||
if [ -n "$COMMITS_TO_APPLY" ]; then
|
echo "✅ Created new initial commit: $(git log --oneline -1)"
|
||||||
echo "Non-merge commits to apply:"
|
|
||||||
for commit in $COMMITS_TO_APPLY; do
|
|
||||||
git log --oneline -1 $commit
|
|
||||||
done
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Apply all non-merge commits since the target commit
|
# Now get all commits after the target commit and apply their changes
|
||||||
for commit in $COMMITS_TO_APPLY; do
|
COMMITS_AFTER_TARGET=$(git rev-list --reverse --no-merges $TARGET_COMMIT..main)
|
||||||
echo "Applying commit: $(git log --oneline -1 $commit)"
|
|
||||||
if git cherry-pick $commit; then
|
|
||||||
echo "✅ Successfully applied $commit"
|
|
||||||
else
|
|
||||||
echo "⚠️ Cherry-pick failed for $commit, trying to resolve..."
|
|
||||||
|
|
||||||
# Check if there are conflicts
|
if [ -n "$COMMITS_AFTER_TARGET" ]; then
|
||||||
if git status --porcelain | grep -q "^UU\|^AA\|^DD"; then
|
echo "📋 Applying changes from commits after $TARGET_COMMIT:"
|
||||||
echo "📝 Conflicts detected, trying to auto-resolve..."
|
|
||||||
|
|
||||||
# Try to resolve by taking the incoming changes
|
for commit in $COMMITS_AFTER_TARGET; do
|
||||||
|
echo "Processing: $(git log --oneline -1 $commit)"
|
||||||
|
|
||||||
|
# Get the commit message and author info
|
||||||
|
COMMIT_MSG=$(git log --format="%B" -n 1 $commit)
|
||||||
|
COMMIT_AUTHOR=$(git log --format="%an <%ae>" -n 1 $commit)
|
||||||
|
COMMIT_DATE=$(git log --format="%ad" -n 1 $commit)
|
||||||
|
|
||||||
|
# Apply the changes from this commit
|
||||||
|
if git diff-tree --no-commit-id --name-only -r $commit | xargs -I {} git show $commit:{} > /dev/null 2>&1; then
|
||||||
|
# Apply file changes
|
||||||
|
git checkout $commit -- . || true
|
||||||
|
|
||||||
|
# Stage all changes
|
||||||
git add -A
|
git add -A
|
||||||
if git cherry-pick --continue; then
|
|
||||||
echo "✅ Resolved conflicts and continued"
|
# Only commit if there are changes
|
||||||
|
if ! git diff --cached --quiet; then
|
||||||
|
# Create new commit with original metadata but new SHA
|
||||||
|
GIT_AUTHOR_NAME=$(echo "$COMMIT_AUTHOR" | cut -d'<' -f1 | xargs)
|
||||||
|
GIT_AUTHOR_EMAIL=$(echo "$COMMIT_AUTHOR" | cut -d'<' -f2 | cut -d'>' -f1)
|
||||||
|
GIT_AUTHOR_DATE="$COMMIT_DATE"
|
||||||
|
|
||||||
|
export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
|
||||||
|
git commit -m "$COMMIT_MSG"
|
||||||
|
echo "✅ Applied changes as new commit: $(git log --oneline -1)"
|
||||||
else
|
else
|
||||||
echo "❌ Could not resolve conflicts, skipping commit $commit"
|
echo "⚠️ No changes to commit for $commit"
|
||||||
git cherry-pick --abort
|
|
||||||
continue
|
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "❌ Cherry-pick failed for other reasons, skipping commit $commit"
|
echo "⚠️ Skipping problematic commit $commit"
|
||||||
git cherry-pick --abort
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "✅ Finished applying commits"
|
echo "✅ Finished creating new history"
|
||||||
else
|
else
|
||||||
echo "✅ No non-merge commits to apply - target commit is up to date with main"
|
echo "✅ No commits after target commit - history starts fresh"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Show what merge commits were skipped
|
|
||||||
MERGE_COMMITS=$(git rev-list --merges $TARGET_COMMIT..main)
|
|
||||||
if [ -n "$MERGE_COMMITS" ]; then
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "📋 Merge commits that were skipped:"
|
echo "=== New History Summary ==="
|
||||||
for commit in $MERGE_COMMITS; do
|
echo "Total commits in new history: $(git rev-list --count github-mirror)"
|
||||||
git log --oneline -1 $commit
|
echo "History starts with: $(git log --oneline --reverse | head -1)"
|
||||||
done
|
echo "Latest commit: $(git log --oneline -1)"
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Remove sensitive files and directories
|
- name: Remove sensitive files and directories
|
||||||
run: |
|
run: |
|
||||||
@@ -152,21 +155,17 @@ jobs:
|
|||||||
echo "Final file structure (top level):"
|
echo "Final file structure (top level):"
|
||||||
ls -la | head -10 || true
|
ls -la | head -10 || true
|
||||||
|
|
||||||
- name: Verify clean history
|
- name: Verify completely new history
|
||||||
run: |
|
run: |
|
||||||
git checkout github-mirror
|
git checkout github-mirror
|
||||||
echo "=== Final branch status ==="
|
echo "=== Final History Verification ==="
|
||||||
echo "Total commits in github-mirror branch:"
|
echo "Total commits in new github-mirror branch: $(git rev-list --count github-mirror)"
|
||||||
git rev-list --count github-mirror
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "Commit history (last 10):"
|
echo "Complete commit history (should start from target commit content):"
|
||||||
git log --oneline -10
|
git log --oneline --reverse
|
||||||
echo ""
|
echo ""
|
||||||
echo "Branch comparison with main:"
|
echo "⚠️ Note: This is a completely NEW history with new commit SHAs"
|
||||||
echo "Non-merge commits in main not in github-mirror:"
|
echo "🔍 Original target commit content preserved but with new commit ID"
|
||||||
git log --oneline --no-merges main..github-mirror || echo "None"
|
|
||||||
echo "Non-merge commits in github-mirror not in main:"
|
|
||||||
git log --oneline --no-merges github-mirror..main || echo "None"
|
|
||||||
|
|
||||||
- name: Check GitHub token
|
- name: Check GitHub token
|
||||||
env:
|
env:
|
||||||
@@ -179,7 +178,7 @@ jobs:
|
|||||||
echo "GitHub token is available (length: ${#GITHUBTOKEN})"
|
echo "GitHub token is available (length: ${#GITHUBTOKEN})"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Push to GitHub
|
- name: Force push completely new history to GitHub
|
||||||
env:
|
env:
|
||||||
GITHUBTOKEN: ${{ secrets.GITHUBTOKEN }}
|
GITHUBTOKEN: ${{ secrets.GITHUBTOKEN }}
|
||||||
run: |
|
run: |
|
||||||
@@ -196,15 +195,17 @@ jobs:
|
|||||||
echo "GitHub remote added:"
|
echo "GitHub remote added:"
|
||||||
git remote -v
|
git remote -v
|
||||||
|
|
||||||
# Force push the filtered branch to GitHub main
|
# Force push the completely new history to GitHub main
|
||||||
echo "Pushing filtered history to GitHub..."
|
echo "🔥 FORCE PUSHING completely new history to GitHub..."
|
||||||
|
echo "⚠️ This will COMPLETELY REPLACE all history on GitHub!"
|
||||||
git push github github-mirror:main --force
|
git push github github-mirror:main --force
|
||||||
echo "✅ Push completed successfully!"
|
echo "✅ Force push completed - GitHub now has completely new history!"
|
||||||
|
|
||||||
- name: Workflow completed
|
- name: Workflow completed
|
||||||
run: |
|
run: |
|
||||||
echo "✅ Mirror to GitHub workflow completed successfully!"
|
echo "✅ Mirror to GitHub workflow completed successfully!"
|
||||||
echo "📊 History starts from commit: 7aca927937"
|
echo "🔥 COMPLETE HISTORY REPLACEMENT: GitHub now has entirely new history"
|
||||||
echo "🔍 Check https://github.com/the-luap/picpeak to verify the mirror"
|
echo "📊 History starts from commit content: 7aca927937"
|
||||||
|
echo "🔍 Check https://github.com/the-luap/picpeak to verify the new history"
|
||||||
echo "📈 Total commits pushed: $(git rev-list --count github-mirror)"
|
echo "📈 Total commits pushed: $(git rev-list --count github-mirror)"
|
||||||
echo "🔀 Note: Merge commits were automatically filtered out"
|
echo "🆕 All commit SHAs are NEW - no connection to previous history"
|
||||||
Reference in New Issue
Block a user