Pular para o conteúdo principal

Recuperação de stash perdida

Bom pessoal, passei um sufoco bem grande esses dias, onde no frigir dos ovos, eu realizei modificações importantíssimas no meu código, fiz (stash), alterei algumas coisas e no fim, (stash clear). Por que? Falta de atenção, stress, loucura, demência, sei lá.
O fato é que percebi o acontecido somente no próximo dia útil (segunda-feira).
Daí, eu tive que por o cérebro para funcionar, lembrar o erro que havia cometido e escolher formas para chegar aos dois kilos de código alterados na sexta feira...

Uma vez que tudo no git possui um SHA-1 e os índices não são apagados automaticamente (git-gc), o que eu limpei do stash deveria estar em algum lugar do banco de dados do meu repositório GIT local.

Mãos a obra na pesquisa e encontramos um camadara muito útil na documentação do (fsck):
  • --no-reflog: Do not consider commits that are referenced only by an entry in a reflog to be reachable. This option is meant only to search for commits that used to be in a ref, but now aren’t, but are still in that corresponding reflog.
Eu sei que as operações da lista stash não aparecem no reflog, então eu elimino as entradas que se encontram somente nele, assim, eu diminuo minha lista de tentativas.
$ git fsck --no-reflog
Checking object directories: 100% (256/256), done.
Checking objects: 100% (166/166), done.
dangling commit 2400322c19dd2c1031585082d81d33c4a5a372a1
dangling commit 4180f8d848c99cdc57a144eef1f54b8533104427
dangling commit 42c01f075ed56701ec6ca3b83ec76446ed6bde0c
dangling blob 32c1913f58001e88a3751b4c8eb0228b27526b17
dangling commit 4d41e16d9e23669acd74aa9aaff9cc9583e1c3ec
dangling blob 6581dd108652f2e926699ba1a2d518561dba522d
dangling commit aa8193f1cf36a7ac95d3a90159577810f4816653
dangling commit aec1a12be165a871d3aa8e3c621636f22f9312d5

Utilizo somente os commits e deixo os arquivos fora da minha pesquisa:
$ git fsck --no-reflog | awk '/dangling commit/{print $3}'
2400322c19dd2c1031585082d81d33c4a5a372a1
4180f8d848c99cdc57a144eef1f54b8533104427
42c01f075ed56701ec6ca3b83ec76446ed6bde0c
32c1913f58001e88a3751b4c8eb0228b27526b17
4d41e16d9e23669acd74aa9aaff9cc9583e1c3ec
6581dd108652f2e926699ba1a2d518561dba522d
aa8193f1cf36a7ac95d3a90159577810f4816653
aec1a12be165a871d3aa8e3c621636f22f9312d5

A partir daí, o limite é o céu. No meu caso eu fiz uma pesquisa em cada um dos hashes fazendo um git show e procurando minha alteração:
for hash in $(git fsck --no-reflog | awk '/dangling commit/{print $3}'); do
  if [[ $(git show $hash) == *"MINHA_MODIFICACAO_PROCURADA"* ]];
  then
    echo $hash;
  fi;
done

Desceu sobre mim uma paz ao ler um único hash encontrado. Fiz um (show) passando o hash encontrado e voilà! Minhas modificações estavam intactas.

Uma vez recuperado, você pode fazer um (cherry-pick), stash apply, ou quaisquer outros artifícios para restaurar o commit.

Espero ter ajudado alguém e quaisquer sugestões, só comentar. Valeu!

Postagens mais visitadas deste blog

Arrays no PostgreSQL

Aquele mesmo projeto que estou trabalhando me exigiu aprender como adicionar um array em tabelas do PostgreSQL. É algo bem simples de se utilizar. Vamos começar criando uma tabela que recebe os arrays:
CREATE TABLE entrada (
  id SERIAL PRIMARY_KEY,
  nf integer,
  data_reg timestamp without time zone DEFAULTnow(),
  data_inst timestamp without time zone,
  descricao text,
  materiais text[][],
  funcionario varchar(50)
)

Criei uma tabela chamada entrada, que serve para registrar materiais vindos para a instituição. As rows possuirão: id (PRIMARY_KEY),nf (número de nota fiscal),data_reg (data em que a query será registrada),data_inst (data que entrou na instituição),descricao (qualquer observação que precisem colocar)funcionario (id do funcionário que realizou a operação)materiais (É nesse momento que inserimos os arrays...Nesse caso, criei um campo (materiais), que é um array de arrays.  Coloco o tipo de campo, no caso text e o que define-o como array "[]", coloquei os colchetes dua…

Problemas com locale em pt_BR no Archlinux

Após três meses de utilização do Ubuntu, decidi voltar para o ArchLinux e me deparei com um problema besta, mas que demorei a descobrir a causa.

Ao instalar o sistema, escolhemos no arquivo locale.gen os charsets desejados para o sistema e depois criamos o arquivo locale.conf, com as indicando o idioma do sistema, unidade monetária, data, etc...
Prefiro utilizar minhas distros em inglês mas claro que desejo que todo o resto esteja configurado para o nosso país. Pois bem, Coloquei no arquivo as seguintes configurações:
LANG=en_US.utf8 LC_TIME=pt_BR.utf8 LC_ALL=pt_BR.UTF8 LC_NUMERIC=pt_BR.utf8 LC_MONETARY=pt_BR.utf8 LC_MEASUREMENT=pt_BR.utf8
O problema é que ele me mostrava as datas todas em inglês e o Gnome ficou sem entender qual LC_TIME e LC_CTYPE eu havia selecionado. Quando eu executava:

$ locale

Eu obtinha exatamente o que eu havia colocado no meu conf e com três linhas de erro, dizendo que não foi possível encontrar o arquivo ou diretório. Depois de pesquisar muito e não encontrar…