0

Objective-git と libgit2 を使用すると、コミットの準備が整ったファイルをステージングするのは非常に簡単です。

GTIndex *repoIndex = [self.repository indexWithError:&error];

[repoIndex removeFile:path error:&error];

if (status != GTFileStatusIgnored && status != GTFileStatusWorkingDeleted) {
    // Now add the file to the index
    [repoIndex addFile:path error:&error];
}

[repoIndex write:&error];

ただし、ファイルのステージングを解除するのは少し難しいことがわかっています。単にリポジトリのインデックスから削除しても、git はファイルが削除されたと判断するため機能しません。これは理にかなっています。私がする必要があるのは、インデックスのインデックス エントリをステージング前のものに変更することです。

diff を使用して古い diff デルタを取得し、そこから a を作成git_index_entryして挿入して、次のことを試みました。

GTIndex *repoIndex = [self.repository indexWithError:&error];
GTBranch *localBranch = [self.repository currentBranchWithError:&error];
GTCommit *localCommit = [localBranch targetCommitAndReturnError:&error];

GTDiff *indexCommitDiff = [GTDiff diffIndexFromTree:localCommit.tree inRepository:self.repository options:nil error:&error];

// Enumerate through the diff deltas until we get to the file we want to unstage
[indexCommitDiff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) {

    NSString *deltaPath = delta.newFile.path;

    // Check if it matches the path we want to usntage
    if ([deltaPath isEqualToString:path]) {
        GTDiffFile *oldFile = delta.oldFile;

        NSString *oldFileSHA = oldFile.OID.SHA;
        git_oid oldFileOID;
        int status = git_oid_fromstr(&oldFileOID, oldFileSHA.fileSystemRepresentation);

        git_index_entry entry;
        entry.mode = oldFile.mode;
        entry.oid = oldFileOID;
        entry.path = oldFile.path.fileSystemRepresentation;

        [repoIndex removeFile:path error:&error];

        status = git_index_add(repoIndex.git_index, &entry);

        [repoIndex write:&error];
    }
}];

ただし、これにより git インデックスが破損した状態のままになり、git コマンドで致命的なエラーがログに記録されます。

fatal: Unknown index entry format bfff0000
fatal: Unknown index entry format bfff0000     

libgit2 を使用してファイルのステージングを解除する正しい方法は何ですか?

4

1 に答える 1