2015-02-06 2 views
1

я пишу простой код для реализации git checkout branch-nameFileMode не может быть изменен, когда извлекаете новый филиал

git_repository *repo = NULL; 
git_signature *sig; 
git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; 
opts.checkout_strategy = GIT_CHECKOUT_FORCE; 

git_signature_now(&sig, "name", "email"); 

git_repository_open(&repo, "test"); 
git_repository_set_head(repo, "refs/heads/v1", sig, NULL); 
git_checkout_tree(repo, NULL, &opts); 

git_signature_free(sig); 
git_repository_free(repo); 

Все работает отлично, за исключением изменения FileMode.

$ git status 
On branch v1 
Your branch is up-to-date with 'sugareps/ibm_r22'. 
Changes to be committed: 
    modified: include/javascript/select2/select2-spinner.gif 
    modified: include/javascript/select2/select2.png 

Changes not staged for commit: 
    modified: /modules/DropDownBrowser.php 


$git diff # or git diff --cached 
old mode 100644 
new mode 100755 

Что мне делать? Может кто-нибудь дать мне некоторое предложение.

+0

Возможно, это ошибка в libgit2. Там [проблема в pygit2] (https://github.com/libgit2/pygit2/issues/423) предполагает, что она не работает. –

+0

Кстати, я только что самостоятельно справился с одной и той же проблемой, и ваша учетная запись - это все, что я нашел в Google до сих пор. Я могу воспроизвести его с помощью очень простого репо с двумя коммитами, которые отличаются только изменением файла. Мой код очень похож на ваш, и я не нашел очевидного обходного пути. Разбиты на 0.21.3, 0.21.5 и 0.22.1. –

ответ

0

Этот link предполагает, что при создании файлов или каталогов libgit2 учитывает umask. Это означает, что если вы хотите, чтобы libgit2 мог создавать файлы с любыми разрешениями, вам нужно сначала установить свой umask в 0.

+0

Это не работает для меня, я добавляю 'umask (0)' перед 'git_checkout_tree'. и получить тот же результат. Но спасибо за ваш повтор :). – Lock

Смежные вопросы