Backport changes from renamed file

后端 未结 7 1074
终归单人心
终归单人心 2020-12-25 13:46

I have two branches: trunk, production. I have found a problem in trunk, made fix and committed it, pushed it. Now it was tested and I need do merge changes into the product

相关标签:
7条回答
  • 2020-12-25 14:36

    I made a shell script that tries to do a cherry-pick while guessing file moves (it doesn't work if you renamed the file itself, only if you moved it to another folder): However: currently it will fail if the commit adds new files or if it itself rename files.

    #!/bin/bash
    #
    # Attemps to guess file moves (rename of folders) when cherry-pick'ing.
    # Gaspard van Koningsveld
    #
    [ "$1" == "" ] && echo "usage: $0 <commit-hash-to-cherry-pick>" && exit 1
    TMP_PATCH_FILE="temp-cherry-pick-patch"
    function abort() {
      echo "Aborting"
      "rm" -f "$TMP_PATCH_FILE"
      exit 1
    }
    function main() {
      echo "Retreiving commit patch..."
      "git" show "$1" > "$TMP_PATCH_FILE" || abort
    
      echo "Matching renamed files..."
      sedcmds=""
      for oldfile in $("grep" -E '(--- a|\+\+\+ b)' "$TMP_PATCH_FILE" | "cut" -c 7- | "sort" | "uniq"); do
        [ -f "$oldfile" ] && continue
        renamefound=0
        oldfilepart="$oldfile"
        while [ $renamefound -eq 0 ]; do
          possiblefiles=$("git" ls-files "**/$oldfilepart")
          if [ "$possiblefiles" != "" ]; then
            if [ $("wc" -l <<< "$possiblefiles") == "1" ]; then
              echo "  $oldfile > $possiblefiles"
              sedcmds="$sedcmds s|/$oldfile|/$possiblefiles|g;"
              break
            else
              echo "  ERROR: More than one rename possibility found for file $oldfile:"
              echo "$possiblefiles"
              abort
            fi
          fi
          prevoldfilepart="$oldfilepart"
          oldfilepart="${oldfilepart#*/}"
          if [ "$prevoldfilepart" == "$oldfilepart" ]; then
            echo "  ERROR: Could not find rename for $oldfile."
            abort
          fi
        done
      done
      echo "Renaming files in patch..."
      "sed" -i "$sedcmds" "$TMP_PATCH_FILE" || abort
      echo "Applying patch as new commit..."
      "sed" -i "s/^commit /From commit /;s/^Author: /From: /" "$TMP_PATCH_FILE" || abort
      "git" am -3 "$TMP_PATCH_FILE"
    
      "rm" -f "$TMP_PATCH_FILE"
    }
    main "$@"
    
    0 讨论(0)
提交回复
热议问题