Я использую libgit2sharp в решении С# для переключения на ветку и втягивания последних изменений. Вот код, который я использую:
public void FetchAll()
{
using (var repo = new Repository(_LocalGitPath))
{
foreach (Remote remote in repo.Network.Remotes)
{
FetchOptions options = new FetchOptions();
options.CredentialsProvider = new CredentialsHandler((url, usernameFromUrl, types) => new UsernamePasswordCredentials()
{
Username = _UserName,
Password = _Password
});
repo.Network.Fetch(remote, options);
}
}
}
public string CheckoutBranch(string branchName)
{
using (var repo = new Repository(_LocalGitPath))
{
var trackingBranch = repo.Branches[branchName];
if (trackingBranch.IsRemote)
{
branchName = branchName.Replace("origin/", string.Empty);
var branch = repo.CreateBranch(branchName, trackingBranch.Tip);
repo.Branches.Update(branch, b => b.TrackedBranch = trackingBranch.CanonicalName);
Commands.Checkout(repo, branch, new CheckoutOptions { CheckoutModifiers = CheckoutModifiers.Force });
}
else
{
Commands.Checkout(repo, trackingBranch, new CheckoutOptions { CheckoutModifiers = CheckoutModifiers.Force });
}
return branchName;
}
}
public void PullBranch(string branchName)
{
using (var repo = new Repository(_LocalGitPath))
{
PullOptions options = new PullOptions();
options.MergeOptions = new MergeOptions();
options.MergeOptions.FailOnConflict = true;
options.FetchOptions = new FetchOptions();
options.FetchOptions.CredentialsProvider = new CredentialsHandler((url, usernameFromUrl, types) => new UsernamePasswordCredentials()
{
Username = _UserName,
Password = _Password
});
repo.Network.Pull(new Signature(_UserName, _Password, new DateTimeOffset(DateTime.Now)), options);
}
}
У меня нет проблем с получением и проверкой ветки. Когда я пытаюсь вытащить последние, я получаю сообщение об ошибке: "Информация о текущем ветке отсутствует". Я полагаю, что это означает, что локальный филиал не знает, из чего должен быть удален правильный удаленный репозиторий, но я не смог понять, как сообщить libgit2sharp, что такое путь удаленного репо. У кого-нибудь есть предложения?
При проведении исследований по этой проблеме я нашел это: https://github.com/libgit2/libgit2sharp/issues/1235. По сути, libgit2sharp dev описывает точную проблему, которую я вижу, но не предоставляет никакого кода для исправления.
Еще одно примечание: я никогда не буду сливать или выталкивать какие-либо изменения из этого репозитория. Я потянул его за автоматическую сборку, поэтому мы можем игнорировать или перезаписывать любые локальные изменения. Мне просто нужно получить последний код.
РЕШЕНИЕ: Я обновил код выше с помощью решения, которое я получил. Вы должны быть очень осторожны, чтобы убедиться, что когда вы проверяете ветку, вы проверяете флажок isRemote на ветки, которую вы проверяете, на значение true. Если вы проверите ветку, которая не является удаленной, она установит пульт на ".". в вашем конфигурационном файле git, и вам нужно вручную его исправить. Если нет действительного пульта дистанционного управления, вы не сможете потянуть изменения ветки.
Не используйте образец кода в wiki libgit2sharp, если они не добавят эту проверку.
Вы можете настроить информацию отслеживания в локальной ветке с помощью Refspec:
using (var repo = new Repository("/Users/sushi/code/redux/mono"))
{
var trackingBranch = repo.Branches["remotes/origin/work-btls"];
if (trackingBranch.IsRemote)
{
var branch = repo.CreateBranch("SomeLocalBranchName", trackingBranch.Tip);
repo.Branches.Update(branch, b => b.TrackedBranch = trackingBranch.CanonicalName);
repo.Checkout(branch, new CheckoutOptions { CheckoutModifiers = CheckoutModifiers.Force });
}
}
Вы можете использовать git
, чтобы проверить, что SomeLocalBranchName
теперь отслеживает remotes/origin/work-btls
:
>>>git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
SomeLocalBranchName <- remotes/origin/work-btls
master <- origin/master
>>>git status
On branch SomeLocalBranchName
Your branch is up-to-date with 'remotes/origin/work-btls'.