2

git_stash_save()と同様に、変更を保存できますgit stash。変更を元に戻す機能はありgit stash popますか?

git_stash_foreach()とが見えますgit_stash_drop()。この機能を実現するためにそれらを使用する方法はありますか?


編集: nulltokenの回答に基づいて、次のコードが機能すると予想していました:

void tstStashPop ( const char * repo_path )
{
  git_repository *repo;
  git_commit * top_cmt;
  git_oid saved_stash;
  git_tree * top_tree;
  git_signature *signature;

  // open a repository
  if ( git_repository_open(&repo, repo_path) != 0 )
  {
    assert(false);
  }
  else
  {
    // create a signature
    git_signature_new(&signature, "no name", "no.name@gmail.com", 1323847743, 60);

    if ( git_stash_save( &saved_stash, repo, signature,
               "message for this stash", /*GIT_STASH_INCLUDE_UNTRACKED*/0) 
       != GIT_ENOTFOUND )
    {
      // get the commit that was saved by git stash save
      if ( git_commit_lookup( &top_cmt, repo, &saved_stash ) != 0 ) 
      {
        assert(false);
      }
      else
      {
        // get the tree for this commit
        if ( git_commit_tree( &top_tree, top_cmt ) != 0 )
        {
          assert(false);
        }
        else
        {
          // checkout the tree
          git_checkout_opts opts;
          opts = GIT_CHECKOUT_OPTS_INIT;
          opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE;
          if ( git_checkout_tree( repo, (git_object*)top_tree, &opts ) != 0 )
          {
            assert(false);
          }
        }
      }
      // remove the stashed commit
      git_stash_drop( repo, 0 );
    }

    // free signature
    git_signature_free(signature);

    // free repo
    git_repository_free(repo);
  }
}

エラーは報告されていませんが、変更は復元されていません。git_stash_save()動作し(メッセージは で表示されますgit stash list)、git_stash_drop()動作します。ただし、git_checkout_tree()効果はありません。

また、解放する必要がtop_treeありtop_cmtますか?

4

2 に答える 2

2

将来のシーカーのためのコピー&ペースト スニペットとしての最終的なバリアント:

void tstStashPop ( const char * repo_path )
{
  git_repository *repo;
  git_commit * top_cmt;
  git_oid saved_stash;
  git_tree * top_tree;
  git_signature *signature;

  // open a repository
  if ( git_repository_open(&repo, repo_path) != 0 )
  {
    assert(false);
  }
  else
  {
    // create a signature
    git_signature_new(&signature, "no name", "no.name@gmail.com", 1323847743, 60);

    if ( git_stash_save( &saved_stash, repo, signature,
               "message for this stash", /*GIT_STASH_INCLUDE_UNTRACKED*/0) 
       != GIT_ENOTFOUND )
    {
      // get the commit that was saved by git stash save
      if ( git_commit_lookup( &top_cmt, repo, &saved_stash ) != 0 ) 
      {
        assert(false);
      }
      else
      {
        // get the tree for this commit
        if ( git_commit_tree( &top_tree, top_cmt ) != 0 )
        {
          assert(false);
        }
        else
        {
          // checkout the tree
          git_checkout_opts opts;
          opts = GIT_CHECKOUT_OPTS_INIT;
          opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE;
          if ( git_checkout_tree( repo, (git_object*)top_tree, &opts ) != 0 )
          {
            assert(false);
          }
          git_tree_free(top_tree);
        }
        git_commit_free(top_cmt);
      }
      // remove the stashed commit
      git_stash_drop( repo, 0 );
    }

    // free signature
    git_signature_free(signature);

    // free repo
    git_repository_free(repo);
  }
}
于 2013-03-29T14:23:01.383 に答える
2

git stash popで変更を元に戻す機能はありますか?

まだ。実際、git stash (pop | apply)スタッシュの内容を作業ディレクトリの現在の内容とマージします。

残念ながら、libgit2 ではまだmerge利用できません。

アップデート

ただし、 git_checkout_tree() は効果がありません。

を通じてチェックアウト戦略を定義することをお勧めしますopts.checkout_strategy。デフォルト値は予行演習であり、何も更新しません。

オプションの詳細については、include/git2/checkout.hを参照してください。

また、top_tree と top_cmt を解放する必要がありますか?

確かgit_tree_free()に、git_commit_free()ここで役に立ちます。

または、呼び出しを避けて、ツリーにピールするgit_commit_tree()コミットを直接渡すこともできます。git_checkout_tree()

于 2013-03-29T09:44:43.263 に答える