2015-04-10 1 views
10

Я пробовал все утро, чтобы открыть существующее репо и сменить ветку или тег, используя nodegit. Документация обширна, но, похоже, устарела. Любые идеи о том, что я делаю неправильно?Switch Branch/Tag with nodegit

var NodeGit = require("nodegit"); 
var open = NodeGit.Repository.open; 
var Tag = NodeGit.Tag; 
var Checkout = NodeGit.Checkout; 

open(location).then(function (repo) { 
    Tag.list(repo).then(function(array) { 
     // array is ['v1.0.0'] 
     var ref = array[0] 
     Checkout.tree(repo, ref).then(function() { 
      // Want tag to be checked out out in detached state. 
     }); 
    }); 
}); 
+0

Вы не объяснили, что произойдет, когда вы запустите этот код. – Chris

+0

Ничего не происходит - ошибок не было. Репо в настоящее время находится на главной ветке, после этого оно все еще находится на главной ветке. Я хочу переключиться на тег v1.0.0. – ngourley

ответ

9

Таким образом, у вас есть недостаток в коде. Во-первых, вы не прекращаете цепочку обещаний, поэтому проглатываются ошибки. Вы хотите закончить его либо .catch, либо .done.

Во-вторых, я думаю, вы не совсем уверены, что делает проверка. Одна из запутанных вещей с низким уровнем git и тем, как она отличается от git CLI, заключается в том, что Checkout только обновляет рабочий каталог, чтобы отразить дерево, на которое указывает второй параметр.

В-третьих, вы передаете строку методу, ожидающему чего-то другого. The docs показывают, что он ищет Oid, Tree, Commit или Reference. Давайте немного поднимем этот код.

var NodeGit = require("nodegit"); 
var open = NodeGit.Repository.open; 
var Tag = NodeGit.Tag; 
var Checkout = NodeGit.Checkout; 

open(location).then(function (repo) { 
    return Tag.list(repo) 
    .then(function(array) { 
     // array is ['v1.0.0','v2.0.0'] 
     return Tag.lookup(repo,array[0]); 
    }) 
    .then(function(tag) { 
     return Checkout.tree(repo, tag.targetId(), { checkoutStrategy: Checkout.STRATEGY.SAFE_CREATE}) 
     .then(function() { 
      repo.setHeadDetached(tag.targetId(), repo.defaultSignature, "Checkout: HEAD " + tag.targetId()); 
     }); 
    }); 
}) 
.catch(function(error) { 
    // log error 
}); 

Это должно указывать на вас в правильном направлении. Если вам нужна дополнительная помощь, я бы рекомендовал остановиться на нашем gitter channel, где мы довольно активны.

+1

Это заставило меня пойти, и я получил помощь на канале gitter. Спасибо за направление! – ngourley

+6

Вы должны рассмотреть возможность добавления ваших результатов здесь, StackOverflow - это место для обмена знаниями, а не только с технической поддержкой: / –

0

Следующая полный решение работает для меня тегов, которые могут быть легкие или аннотированные метки: (repo является открытым хранилище, tag это имя тега в кассе)

var Git = require("nodegit"); 

function checkOutTag(repo, tag) { 
    return Git.Reference 
     .dwim(repo, "refs/tags/" + tag) 
     .then(function (ref) { 
      return ref.peel(Git.Object.TYPE.COMMIT); 
     }) 
     .then(function (ref) { 
      return repo.getCommit(ref); 
     }) 
     .then(function (commit) { 
      return Git.Checkout 
      .tree(repo, commit, {checkoutStrategy: Git.Checkout.STRATEGY.SAFE}) 
      .then(function() { 
       return repo.setHeadDetached(commit, repo.defaultSignature, 
              "Checkout: HEAD " + commit.id()); 
      }) 
    }); 
} 

It может быть проще, используя repo.getReferenceCommit(), но эта команда в настоящее время не работает для аннотированных тегов. См. Также https://github.com/nodegit/nodegit/issues/1370, который отслеживает эту проблему.