Estou tendo um problema estranho que não consigo resolver. Aqui está o que aconteceu:
Eu tinha alguns arquivos de log em um repositório github que não queria lá. Encontrei este script que remove arquivos completamente do histórico do git assim:
#!/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
files=$@
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
É claro que primeiro fiz um backup e depois tentei. parecia funcionar bem. Em seguida, executei um git push -f e fui recebido com as seguintes mensagens:
error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
error: Cannot update the ref 'refs/remotes/origin/master'.
Tudo parece ter funcionado bem, porque os arquivos parecem ter sumido do repositório do GitHub, se eu tentar empurrar novamente, obtenho a mesma coisa:
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
EDITAR
$ sudo chgrp {user} .git/logs/refs/remotes/origin/master
$ sudo chown {user} .git/logs/refs/remotes/origin/master
$ git push
Everything up-to-date
Obrigado!
EDITAR
Uh Oh. Problema. Estive trabalhando neste projeto a noite toda e só fui confirmar minhas alterações:
error: Unable to append to .git/logs/refs/heads/master: Permission denied
fatal: cannot update HEAD ref
Então eu:
sudo chown {user} .git/logs/refs/heads/master
sudo chgrp {user} .git/logs/refs/heads/master
Eu tento o commit novamente e obtenho:
error: Unable to append to .git/logs/HEAD: Permission denied
fatal: cannot update HEAD ref
Então eu:
sudo chown {user} .git/logs/HEAD
sudo chgrp {user} .git/logs/HEAD
E então eu tento o commit novamente:
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
Hooray. Eu pulo em http://GitHub.com e verifico o repositório, e meu último commit não está onde posso ser encontrado. :: coçar a cabeça :: Então eu empurro novamente:
Everything up-to-date
Umm ... não parece. Nunca tive esse problema antes, pode ser um problema com o github? ou eu baguncei alguma coisa com meu projeto git?
EDITAR
Esqueça, eu fiz um simples:
git push origin master
e funcionou bem.
sudo chown -R "$USER" .
e não presumir sanidade. :)USER
não é garantido por pubs.opengroup.org/onlinepubs/009695399/utilities/… , então pode ser mais seguro usar"$(id -un)"
.is not in the sudoers file. This incident will be reported.
- alguma dica sobre o que posso fazer? Obrigado."${var:-default}"
expande-se para o valor da variável"$var"
, a menos que esse valor esteja vazio ou não definido, caso em que é resolvido paradefault
. Assim, podemos expandir para"$USER"
ou a saída gerada pela execuçãoid -un
.Vamos nos concentrar exatamente no que está reclamando:
Antes de fazer alterações recursivas de mod / propriedade, vá até aquele arquivo e corrija as permissões que estão incorretas.
Acho que causei esse problema criando um branch enquanto era root e, em seguida, tentando mexer com esse branch como meu usuário.
fonte
No meu caso, criei os arquivos com permissão de root localmente e tentei enviar o código para o remoto com permissões locais. Então eu executei este comando
para descobrir o que todos os arquivos têm "root" como proprietário. E então mudei o proprietário de todos os arquivos que estão sob root para locais usando o seguinte comando
Então, consegui enviar meu código de local para remoto.
fonte
sudo chown parineethat `find . -user root`
não é confiável - não funciona bem com nomes de arquivos com espaços. Em vez disso,sudo find . -user root -exec chown parineethat {} +
. Veja BashPitfalls # 1 para uma discussão relevante.Isso mudará todos os seus arquivos .git e diretórios recursivamente (de raiz a 1000) e fornecerá uma lista completa de todas as mudanças feitas no terminal.
fonte
Tentei consertar a propriedade do Git, mas ainda não funciona.
Mas consegui consertar criando a filial local com um nome diferente e excluindo-a.
Então, eu verifico o mesmo nome de branch novamente e funciona.
TLDR;
Não consigo verificar `staging / rc '.
Então, eu verifico usando, em
staging
vez disso, que o remoto está apontando para `staging / rc '.E, eu excluo e checkout novamente. Mas, desta vez, uso
staging/rc
como meu nome de filial local.Funciona e não tenho ideia do porquê.
fonte
Por favor, primeiro dê as permissões da
root
conta como abaixodepois disso, execute o comando commit
fonte
chown -R root:user directory
, e entãochmod -R 775 directory
(ou770
, se outras contas também não precisarem de acesso de leitura).