2015-01-31 6 views
0

을 git2go 다음 작업을 수행 할 수 있습니다libgit2 사용하여 임시 인덱스에서 트리 객체를 생성 - 명령 행에서

$ touch foo 

$ GIT_INDEX_FILE=/tmp/tmp.d95ehfhUOffoo/index git add -A 

$ GIT_INDEX_FILE=/tmp/tmp.d95ehfhUOffoo/index git status -s 
A foo 

$ git status -s 
?? foo 

$ GIT_INDEX_FILE=/tmp/tmp.d95ehfhUOffoo/index git write-tree 
b8f7b1e052b441b53a969014803516bb7e681760 

$ git cat-file -p b8f7b1e052b441b53a969014803516bb7e681760 
100644 blob ae3fdc2989ae00d75ec106feadb78ed9f98ba41a .gitignore 
100644 blob 4e1e0d2f722485c7d284fb5cd7da855826e39b5a .rspec 
100644 blob 4bc0f1cdd31d348ddc0e91365c5be5a40104fa17 Dockerfile 
100644 blob 7dc939ea79c2bd70d8d32416f9da8aa568029b05 Gemfile 
100644 blob 145bb24613da12ffef73d5db34e89e2ea8e265ad LICENSE.txt 
100644 blob b8a804e12699a964dbeb97b7a632250192421294 README.md 
100644 blob 809eb5616adcc0ebb78862099794489bd5b5b1a0 Rakefile 
100644 blob a18114c31713746a33a2e70d9914d1ef3e781425 foo 
040000 tree 3c8a789fc07c8f35fb96a7e77896cbbf2384e3d7 lib 
040000 tree a5e7e5d6a85504f30912a8f65a498d17fe989c01 spec 
100755 blob 0dd422b073bc1123cdf4979432822db773463537 test 

참고이 나는 푸 개최되지 않았 음을 보여줍니다 저장소 인덱스를 사용 git status을 실행할 때 .

그래서 어떻게 git2go로이 작업을 수행 할 수 있습니까? 지금까지 한 시도 :

Error: Could not add paths to index. Index is not backed up by an existing repository. 

가 어떻게 저장소와 메모리 인덱스에를 연결 않습니다에

func Worktree() (string, error) { 

› repo, err := git.OpenRepository(".") 
› if err != nil { 
› › return "", err 
› } 

› index, err := git.NewIndex() 
› if err != nil { 
› › return "", err 
› } 

› err = index.AddAll([]string{"."}, git.IndexAddDefault, nil) 
› if err != nil { 
› › return "", err 
› } 

› treeOid, err := index.WriteTreeTo(repo) 
› if err != nil { 
› › return "", err 
› } 

› return treeOid.String(), nil 
} 

결과?

git_index_opengit_index_read과 같이 git2go에서 구현되지 않은 libgit 기능이있는 것 같습니다. 나는 많은 코드를 스캔하고 많은 libgit2 api를 읽었다.

일부 포인터 (아니 포인터가 아닙니다)가 좋습니다.

답변

0

작성한 순전히 메모리 색인은 어떤 저장소에 대해서도 알지 못하기 때문에 WriteIndexTo()을 사용해야하고 리포 지 토리를 제공해야합니다. 같은 이유로, 인덱스가 저장소와 연관되지 않아 파일이 어디에 있는지 알 수 없으므로 파일에 대한 상대 경로를 사용하려는 모든 메소드가 작동하지 않습니다. 대신 IndexEntry을 사용하고 세부 정보를 입력해야합니다.

상대 경로 방법이 필요한 경우 리포지토리가없는 인덱스에서와 마찬가지로 리포지토리에서 인덱스를 가져 와서 디스크에 다시 쓰지 않고 트리를 만들 수 있습니다. 그런 다음 메모리에서 수행 한 변경 사항을 무시할 수 있습니다.

해당 저장소에서 색인을 다시 사용해야하는 경우 디스크에있는 버전에서 다시 읽으려면 git_index_read()이 필요하지만이 시점에는 git2go에 래핑되지 않았을 수 있습니다.

+0

가능한 경우 인 메모리 인덱스를 사용하는 것을 선호합니다. 나는 IndexEntry를 통해이 새로운 인덱스에 전체 작업 디렉토리를 추가하는 방법에 대해 아직도 명확하지 않다. 단일 블롭을 추가하는 테스트의 예가 있지만 나무를 만드는 것에 대해 뭔가 빠져 있다고 생각합니다. –