web-dev-qa-db-ja.com

Github Actionsの中でgit Rebase.

開始されたコミットを変更することになっているgithubアクションを設定しました。これは好きです

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Do some computations
        run: |
          # Create some new files that should be added to the commit
          dvc repro
      - name: Commit Results
        run: |
          git config --local user.email "[email protected]"
          git config --local user.name "GitHub Action"

          git add .
          git commit --amend --no-edit

          git Push --force

アクションの実行中にブランチにアップデートがない場合は、これは正常に機能します。いくつかの小さなオフセットで実行されていて、結果を組み合わせるために次の操作を実行しようとすると、より複雑になります。

- name: Commit Results
        run: |
          git config --local user.email "[email protected]"
          git config --local user.name "GitHub Action"

          CIREVISION=$(git rev-parse HEAD)

          # stash changes
          git add .
          git stash

          # update for new commit
          git pull --rebase

          # start rebase only on the commit of this CI run
          GIT_SEQUENCE_EDITOR="sed -i -re '0,/pick/{s/pick/edit/}'" git rebase -i "$CIREVISION^"

          # update files and commit
          git stash pop
          git add .
          git commit --amend --no-edit

          # finish rebase <- this fails with a merge conflict
          git rebase --continue

          git Push --force

単一の変更ファイルの場合metrics.jsonが失敗する

Auto-merging metrics.json
CONFLICT (content): Merge conflict in metrics.json
Rebasing (2/3)
error: could not apply ABCD123... TEST01
hint: Resolve all conflicts manually, mark them as resolved with

git status | grep both | awk '{print $3}' | xargs git checkout --ours .のようなものを使用しようとしましたが、マージされないが、常に現在のブランチに存在するファイルのバージョンを受け入れましたが、マージの競合を解決できませんでした。

もう少しの状況:

私はGitHub CIを一緒に使用しています cml.dev バージョン管理には、研究データの完全な再現性を可能にしています。パラメータファイルを更新します。更新されたパラメータでコミットするが、古いメトリックが実行できないため、元のコミットを変更する必要があります。

私はそれが持っている結果を知っています、リポジトリへのプッシュを強制的にそして私は危険を冒しても構わないと思っています。

私は通常ソフトウェア開発のためにgitを使い、既存のGIT構造体を変更していないので、私は通常これをやりたくないので。

4
PythonF

必要なのは、アップストリーム変更に関係なく現在の状態をコミットすることがfetchreset

BRANCH=experiment
git fetch --all
git reset --mixed Origin/$BRANCH
git add .
git commit -m "a new experiment"
git Push Origin HEAD:$BRANCH
 _

当然Pushは失敗する可能性があるため、全体がリトライループにあるべきです。これにより、CIの怖いが--forceプッシュします。

1
casper.dcl