2010-04-15 17 views
47

Mam dziwny problem, którego nie mogę rozwiązać. Oto, co się stało:Błąd Git: Nie można dołączyć do pliku .git/logs/refs/remote/origin/master: Odmowa uprawnień

Mam kilka plików dziennika w repozytorium github, których nie chciałem tam. Znalazłem ten skrypt, który całkowicie usuwa pliki z historii git tak:

#!/bin/bash 
set -o errexit 

# Author: David Underhill 
# Script to permanently delete files/folders from your git repository. To use 
# it, cd to your repository's root and then run the script with a list of paths 
# you want to delete, e.g., git-delete-history path1 path2 

if [ $# -eq 0 ]; then 
    exit 0are still 
fi 

# make sure we're at the root of git repo 
if [ ! -d .git ]; then 
    echo "Error: must run this script from the root of a git repository" 
    exit 1 
fi 

# remove all paths passed as arguments from the history of the repo 
[email protected] 
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD 

# remove the temporary history git-filter-branch otherwise leaves behind for a long time 
rm -rf .git/refs/original/ && git reflog expire --all && git gc --aggressive --prune 

I, oczywiście, wykonana kopia zapasowa, a następnie próbował go. Wydawało się, że działa dobrze. I wtedy zrobił -f git wypychania i był witany z następujących komunikatów:

error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied 
error: Cannot update the ref 'refs/remotes/origin/master'. 

wszystko wydaje się być popychany w porządku, chociaż, ponieważ pliki wydają się być poszedł z repozytorium GitHub, gdy próbuję i wcisnąć znowu dostać to samo:

error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied 
error: Cannot update the ref 'refs/remotes/origin/master'. 
Everything up-to-date 

EDIT

$ sudo chgrp {user} .git/logs/refs/remotes/origin/master 
$ sudo chown {user} .git/logs/refs/remotes/origin/master 
$ git push 
Everything up-to-date 

dzięki!

EDIT

Uh Oh. Problem. Pracuję nad tym projektem przez całą noc i po prostu poszedł do popełnienia moje zmiany:

error: Unable to append to .git/logs/refs/heads/master: Permission denied 
fatal: cannot update HEAD ref 

Więc:

sudo chown {user} .git/logs/refs/heads/master 
sudo chgrp {user} .git/logs/refs/heads/master 

I spróbuj ponownie popełnić i uzyskać:

error: Unable to append to .git/logs/HEAD: Permission denied 
fatal: cannot update HEAD ref 

Więc:

sudo chown {user} .git/logs/HEAD 
sudo chgrp {user} .git/logs/HEAD 

A następnie Ponownie testuję:

16 files changed, 499 insertions(+), 284 deletions(-) 
create mode 100644 logs/DBerrors.xsl 
delete mode 100644 logs/emptyPHPerrors.php 
create mode 100644 logs/trimXMLerrors.php 
rewrite public/codeCore/Classes/php/DatabaseConnection.php (77%) 
create mode 100644 public/codeSite/php/init.php 
$ git push 
Counting objects: 49, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (27/27), done. 
Writing objects: 100% (27/27), 7.72 KiB, done. 
Total 27 (delta 15), reused 0 (delta 0) 
To [email protected]:IAmCorbin/MooKit.git 
59da24e..68b6397 master -> master 

Hura. Wskakuję na http://GitHub.com i sprawdzam repozytorium, a moje ostatnie zatwierdzenie nie jest tym, gdzie można je znaleźć. :: zarysowania głowy :: Więc ponownie:

Everything up-to-date 

Umm ... to nie wygląda tak. Nigdy wcześniej nie miałem tego problemu, czy to może być problem z githubem? czy coś zepsułem z moim projektem git?

EDIT

Nevermind, zrobiłem prosty:

git push origin master 

i przepychanie porządku.

Odpowiedz

121

Wygląda na to, że uruchomiłeś git jako root, zmieniając w ten sposób własność niektórych plików śledzących lokalizację oddziału origin.

Fix własność pliku i powinno być w porządku:

# run this from the root of the git working tree 
sudo chown -R "${USER:-$(id -un)}" . 
+0

To polecenie zadziałało dla mnie. Przebiegłem go od korzenia klona. Dzięki @CharlesDuffy! – ariestav

+2

@ Mr.Stranger, tylko jeśli masz przyzwoitą wartość IFS i nazwę użytkownika (nazwy użytkownika ze spacjami mogą się zdarzyć, na przykład na cygwin). Bezpieczniej zacytować: 'sudo chown -R" $ USER ".' I nie zakładaj poczytalności. :) –

+0

@ Mr.Stranger, ... także, 'USER' nie jest gwarantowane przez http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_05_03, więc może być bezpieczniej używać '" $ (id -un) "'. –

-7

proszę najpierw dać uprawnienia z root uwagę jak poniżej

chmod -R 777 foldername 

potem uruchomić polecenie popełnienia

+5

Jest to bardzo niebezpieczne - daje dowolne konto w systemie, w tym upośledzony demon z tylko uprawnieniami "nobody", zapisuj dostęp do twoich plików. Demony systemowe używają "nikogo" (lub innych nieuprawnionych kont) dla komponentów wrażliwych na bezpieczeństwo *, ponieważ * konto nikogo nie może robić niczego zbyt ryzykownego, nawet jeśli zostało naruszone. Pozwalając wszystkim użytkownikom, nawet nikomu, na zapisywanie swoich plików, czynisz podstawowe środki bezpieczeństwa bezużytecznymi. –

+1

Jeśli z jakiegoś powodu chciałeś, aby twoje pliki były własnością root i mogły być zapisywane przez konkretnego użytkownika innego niż root, bezpiecznym sposobem na to (w systemie, w którym każdy użytkownik ma własną grupę, jak to jest w zwyczajowej praktyce) jest " chown -R root: katalog użytkownika', a następnie 'chmod -R 775 katalog' (lub' 770', jeśli inne konta również nie wymagają dostępu do odczytu). –

+1

@JasonGlisson, coś, co "działa" tylko poprzez tworzenie masywnych luk w zabezpieczeniach, jest prawdopodobnie czymś, co lepiej byłoby pozostać zepsute. –

1

W w moim przypadku utworzyłem pliki z uprawnieniami administratora na poziomie lokalnym i próbowałem przesłać kod do zdalnego przy pomocy uprawnień lokalnych. Tak więc uruchomiłem to polecenie, aby dowiedzieć się, jakie pliki mają "root" jako właściciel. A potem zmienił właściciela dla wszystkich plików, które są pod root lokalny za pomocą następującej komendy

$sudo chown parineethat `find . -user root` 

Potem udało mi się wcisnąć mój kod z lokalnego na pilocie.

+0

'' 'sudo chown parineethat' find. -user root' '' 'jest zawodny - nie będzie działał poprawnie z nazwami plików ze spacjami. Zamiast tego "sudo find. -user root -exec chine parineethat {} + '. Zobacz [BashPitfalls # 1] (http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29) dla odpowiedniej dyskusji. –

0

Skupmy się na tym, co to dokładnie narzekają:

Permission denied error: Cannot update the ref 'refs/remotes/origin/master'.

Przedtem cyklicznych zmian mod/własności, trawers drodze do tego pliku i naprawić wszelkie uprawnienia, które są nieprawidłowe.

Myślę, że spowodowałem ten problem, tworząc gałąź, gdy byłem rootem, a następnie próbując zadzwonić z tej gałęzi jako mój użytkownik.

Powiązane problemy