2016-12-01 4 views
0

Je veux accéder à certains blobs à un moment donné de l'histoire des pensions.Git: obtenir le chemin blob dans le répertoire .git

Actuellement, je fais cela avec git show $REV:$PATH. Mais les fichiers sont assez volumineux et je ne veux pas qu'ils soient lus et redirigés dans un script. Je veux obtenir leur chemin et ensuite lire en tant que fichiers simples. Puis-je me fier à la mise en page décrite dans la documentation actuelle (par exemple .git/objects/ee/2403ffd236587a2b17ddc35b0e711fc99ba6a0), obtenir le hachage de fichier et le transformer manuellement en chemin? Je veux dire qu'il ne changera pas bientôt dans les futures versions et le répertoire des objets a toujours cette structure. Existe-t-il une façon plus simple de faire cela avec une commande de plomberie?

+1

Qu'en est-il de [packed repositories] (https://git-scm.com/docs/git-repack) (par exemple, après l'exécution de 'git repack -ad')? Dans un référentiel compact, les blobs peuvent ne pas exister en tant que fichiers autonomes. – Leon

+1

Les fichiers dans .git/objets ne sont pas les données d'origine. Ils sont compressés et ont un petit en-tête. Vous ne gagnez rien en accédant directement aux fichiers. – j6t

+0

@Leon @ j6t Donc, en d'autres termes, ce que je veux c'est juste un rêve et l'accès direct au répertoire '.git' est encore une mauvaise idée? Je pensais que les blobs restent toujours intacts ... –

Répondre

1

Bien que les données blob estinviolable et sacrosanct, il est également dans un format inutilisable pour de simples mortels:

  • Comme j6t said in a comment, il est zlib-dégonflé (mais cela est un détail de mise en œuvre, pas une promesse , c'est-à-dire que vous n'êtes pas supposé juste l'ouvrir et le lire et utiliser un inflateur zlib pour le restaurer, vous êtes supposé laisser Git faire cela pour vous).

  • Comme Leon said in a comment, il peut avoir été emballés, auquel cas il n'y a pas de fichier objet non emballé pour ouvrir et lire en premier lieu. Au lieu de cela, vous devez ouvrir les fichiers d'index du pack (pour trouver le bon fichier pack) puis le bon fichier pack (pour trouver les données d'emballage avec le répertoire qui localise l'objet et ses bases), puis annuler le style xdelta, mais not actually xdelta, la compression de ces éléments.

Si vous voulez lire le fichier avec les commandes de plomberie, vous pouvez d'abord trouver le hachage:

$ git rev-parse HEAD~20:Makefile 
bdb55792f11a9f9565c4aad147a492caed7f09c3 

puis utilisez git cat-file -p pour extraire l'objet brut ou git cat-file -t pour obtenir son type (ou --batch-check pour lire des informations sur l'objet, etc.). Notez que vous pouvez en fait juste passer le chemin directement à git cat-file lui-même ainsi:

$ git cat-file -t HEAD~20:Makefile 
blob 

Notez, cependant, un bloc de trébuchement plus de potentiel: lors de l'accès au contenu d'un blob soit git cat-file -p <blob-specifier> ou git show <blob-specifier>, vous obtenez le format dans le référentiel des données. Autrement dit, lors de la vérification d'un commit spécifique (avec git checkout), Git extraira un fichier .gitattributes et/ou utilisera les paramètres git config pour trouver les filtres de retouche et/ou les ajustements CR-LF à effectuer. Ces filtres sont appliqués aux données dans le référentiel pour produire la copie de l'arborescence du fichier. Mais lorsque vous utilisez git show ou git cat-file -p pour accéder aux données du référentiel, aucun filtre n'est utilisé.

+0

Merci pour cette réponse détaillée.Oui, je sais qu'il est possible de le faire avec des commandes de plomberie mais le but était d'obtenir le fichier lui-même ... J'ai compris maintenant que cette idée ne pouvait pas être implémentée et utilisera la sortie de 'git show'. En outre, bon point que vous avez explicitement noté que git ne touche pas de nouveaux symboles de ligne. –