2 votes

Métadonnées Git - existe-t-il un moyen d'ajouter des métadonnées git indépendantes de chaque branche ?

Objectif final : Je veux avoir des fichiers qui sont suivis par Git, mais faire en sorte que ces fichiers soient l'objet d'un suivi par Git. même version pour toutes les branches . Si vous gitignorez des fichiers, ceux-ci sont les mêmes pour toutes les branches, mais ne sont malheureusement pas suivis. Quand je lance git push ou autre, j'ai besoin de ces fichiers pour passer d'un dépôt à l'autre, etc.

Par exemple, les données qui se trouvent dans le dossier .git sont généralement ignorées par git. Je veux ajouter des données à mon repo de façon à ce qu'elles soient indépendantes de toutes les branches, mais qu'elles apparaissent quand même dans toutes les branches, et que lorsque vous clonez le repo, les données apparaissent.

Est-ce possible ? Ainsi, par exemple, si le .git dir ressemble :

.git/
  branches/
  hooks/
  objects/
  config
  HEAD
  index

Je pensais ajouter un dossier :

.git/
  .oresoftware/

et mettre mes données là-dedans, où ces données sont indépendantes de toutes les branches.

Je ne pense pas que cela fonctionnera, car les données du dépôt .git ne sont pas vraiment suivies. Je cherche quelque chose qui soit suivi par git, mais qui soit le même pour toutes les branches...

Mise à jour : Après avoir lu les réponses et réfléchi à ce sujet pendant un certain temps, j'ai pensé que peut-être si je modifiais le commit initial avec de nouveaux fichiers, alors cela pourrait fonctionner comme par magie, mais bien sûr, ce n'est pas la façon dont Git fonctionne, chaque commit est un instantané total, donc modifier les commits historiques après coup ne changera pas les plus récents.

2voto

w1n5rx Points 452

Ok, je pense avoir compris votre question maintenant. En fait, vous devez ajouter les données dans un dossier visible pour que git puisse les suivre, c'est-à-dire git add <data> dans l'une des branches et merge cette branche à master et ensuite, par conséquent, synchroniser les deux autres branches avec les master ( git fetch origin master && git merge origin master ). Dans ce cas particulier, puisque vous avez ajouté un nouveau fichier/dossier dans git, vous ne serez pas confronté à des conflits de fusion. Enfin, vos données seront disponibles dans toutes les branches. EDIT (d'après le commentaire d'un autre utilisateur) : git cherry-pick <commit-hash> est un autre moyen d'appliquer un commit spécifique à une branche.

1voto

torek Points 25463

... les données qui se trouvent dans le dossier .git sont généralement ignorées par git.

Ce n'est pas seulement typique c'est nécessaire pour le modèle de sécurité de Git.

(Dans le passé, Git avait quelques bugs dans lesquels vous pouviez créer des fichiers nommés .GIT/whatever et ils iraient dans le dépôt, puis existeraient dans .git/whatever sur les caisses sous Windows et MacOS, puisque ces systèmes ignorent par défaut la casse : un fichier nommé .GIT/foo est en fait créé en tant que .git/foo depuis .git existe à ce moment-là. Ce bogue a été corrigé dans la version moderne de Git).

Je veux ajouter des données à mon repo de façon à ce que les données soient indépendantes de toutes les branches, mais apparaissent quand même dans toutes les branches, et lorsque vous clonez le repo, les données apparaissent.

Est-ce possible ?

Non, mais il y a d'autres moyens d'obtenir ce que tu veux.

Le clonage d'un référentiel est équivalent aux étapes suivantes :

  • Créez un répertoire vide (ou utilisez un répertoire existant) : mkdir _path_ .
  • Créez un nouveau dépôt Git, vide, à cet endroit : cd _path_ && git init .
  • Ajouter un à distance habituellement nommé origin pour l'URL : git remote add origin _url_ .
  • Récupérer tout ce qui se trouve dans cette télécommande : git fetch origin .
  • Créer une branche via git checkout : git checkout _branch_ , donde branche est normalement créé à partir d'un nom de suivi à distance qui a été créé au cours de l'opération précédente git fetch étape.

Il existe un certain nombre de particularités historiques, ainsi que des problèmes si quelque chose ne va pas, de sorte que ce qui précède n'est pas tout à fait parfait. Il omet également une option git config étape. La branche choisie à la fin, pour être créée, est celle de votre -b argument. Si votre -b nomme une balise au lieu d'une branche, Git vérifie simplement un HEAD détaché sans créer de branche. Si vous ne donnez pas de -b Git utilise les directives de la télécommande pour déterminer la branche à créer. La valeur par défaut, et donc le résultat habituel, est master créé pour pointer vers le même commit que origin/master .

Une fois qu'il y a une branche, ou quelques branches, dans un dépôt, ces branches, plus précisément, ces noms comme master y develop et ainsi de suite - sont la propriété de celui qui possède le référentiel. Ils peuvent en faire ce qu'ils veulent ; vous, en tant que propriétaire du référentiel qu'ils ont cloné, ne pouvez rien faire pour les arrêter. Vous ne pouvez pas faire ils ont un fichier qui apparaît dans leurs branches. Bien sûr, nous pouvons dire la même chose de l'ensemble du référentiel, c'est donc un argument un peu stupide : il est vrai que vous ne pouvez pas les contrôler, mais l'ensemble du référentiel n'est pas contrôlé. dépôt est à eux pour en faire ce qu'ils veulent.

Vraisemblablement, alors, ce que vous voulez c'est le rendre facile pour qu'ils installent du contenu dans un fichier quelque part. Le moyen d'y parvenir est de rendre le contenu accessible par un simple nom. Mais quels noms Git offre-t-il ?

Eh bien, au niveau inférieur, ce que les magasins Git sont commet qui, à son tour, stocke arbres (noms de chemin) qui stockent blobs (contenu du fichier). Le nom réel d'un commit, d'un arbre ou d'un blob donné est un ID de hachage brut, et les ID de hachage sont imprévisibles et ne sont généralement pas utiles ou accessibles aux humains. Ainsi, vous pourrait dire aux gens, dire, à :

extraire l'ID de hachage 1bdc91e282c5393c527b3902a208227c19971b84 en .oresoftware/foo

mais (1) l'ID de hachage est incompréhensible, et (2) qui veut taper tout ça ? Et si vous avez plusieurs fichiers, vous aurez besoin d'un ID de hachage de blob par fichier. Beurk !

Il existe cependant une meilleure façon de procéder. Vous pouvez créer un commettre qui contient des fichiers nommés .oresoftware/foo , .oresoftware/bar et ainsi de suite. Il s'agit d'un commit ordinaire qui peut être extrait dans un arbre de travail ordinaire à tout moment.

Maintenant, supposons que vous mettez ce commit sur une branche nommée ORESOFTWARE . Vous pouvez alors dire aux gens qu'ils devraient :

Ejecutar git checkout origin/ORESOFTWARE -- .oresoftware && git reset .oresoftware

qui, certes, n'est pas vraiment plus courte, mais qui au moins n'est pas pleine d'identifiants de hachage incompréhensibles.

El git checkout créera .oresoftware dans leur arbre de travail, pour autant qu'ils aient le nom de suivi à distance, qui est le suivant git fetch (de git clone ) auront créé. 1 Le site git reset .oresoftware supprimera le .oresoftware les entrées qui git checkout créés dans leur index. Si /.oresoftware/ est répertorié dans .gitignore les fichiers de l'arbre de travail seront ignorés. Cela signifie que vous devez avoir un .gitignore dans chaque tip commit de chaque branche, de sorte que le répertoire sera commodément ignoré automatiquement, mais c'est facile à faire.

Enfin, au lieu de demander aux gens d'exécuter deux commandes Git apparemment magiques, vous pouvez dire :

Ejecutar ./setup.sh

ce qui signifie que vous pouvez mettre les deux commandes Git dans un shell script, setup.sh que vous fournissez dans chaque pointe de branche, tout comme vous fournissez la .gitignore dans chaque pointe de branche. De plus, vous pouvez même faire en sorte que votre processus de construction de logiciels automatiquement exécuter ./setup.sh et vous n'avez pas besoin d'une action spéciale de leur part.

Si vous décidez de changer les fichiers qui vont dans .oresoftware vous devez juste faire un nouveau commit sur votre propre site. ORESOFTWARE branche. Celle-ci peut (et devrait probablement) contenir uniquement la branche .oresoftware répertoire. Étant donné que le processus de construction ré-extracte le répertoire à chaque construction, un fichier git fetch permettra à vos utilisateurs d'obtenir une mise à jour origin/ORESOFTWARE nom de suivi à distance, ce qui leur permettra d'obtenir les fichiers mis à jour.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X