web-dev-qa-db-fra.com

Référentiel Git créé sans branche principale

Je veux créer un nouveau référentiel git partagé pour un nouveau projet (sur une machine virtuelle).

L'Iran git --bare init de /.../git/new_proj.git, mais une branche principale n'est pas créée dans le .../git/new_proj.git/refs/heads répertoire. J'ai aussi couru Sudo chmod 777 -R sur mon répertoire, mais cela n'a pas aidé, et toujours aucun maître n'est créé après la commande init.

Edit: J'ai même essayé d'utiliser git init (sans l'indicateur nu), mais la branche principale n'a toujours pas été créée.

Google n'a pas beaucoup aidé dans cette affaire ...

Est-ce que quelqu'un sait quel est le problème? Quelque chose qui me manque? Merci!

21
Ayelet

C'est déjà dans les commentaires sur le autre réponse jusqu'à présent , mais c'est parfaitement normal: un nouveau dépôt, "nu" ou non, n'a pas de commits, donc il n'a pas de références non plus.

Il a un HEAD, qui est un fichier nommé HEAD dans le référentiel (le .git répertoire), contenant une référence de nom de branche symbolique. Si vous cat HEAD tu verras ref: refs/heads/master, ce qui signifie que le nouveau référentiel est "sur le maître de branche", même si le maître de branche n'existe pas encore . Encore une fois, c'est une situation parfaitement normale. On dit que vous êtes "sur une branche à naître", à ce stade.

Lorsque vous ajoutez une ou plusieurs validations à ce référentiel vide, la branche master peut — s'il s'agit d'un référentiel nu, vous pouvez l'ajouter via git Push qui peut ne pas fournir une branche master, alors ne disons pas "does" :-) bien que généralement master do — existe à ce moment-là, avec la référence pointant vers le nouveau commit (ou la nouvelle astuce commit d'une chaîne de commits).

Dans tout dépôt (nu ou non, encore une fois), vous pouvez être "sur" une branche qui n'existe pas. En particulier, dans un repo ordinaire, vous pouvez faire:

$ git checkout --Orphan newbranch

qui vous met "sur" newbranch (en écrivant ref: refs/heads/newbranch en HEAD) sans réellement créer newbranch encore, faisant de newbranch une "branche à naître" ". Le commit suivant fait alors apparaître newbranch, et ce commit n'a pas de commit parent (d'où le --Orphan part): c'est un nouveau commit root. C'est de la même manière que master entre en vigueur lors de son premier commit.

Si vous le souhaitez, vous pouvez le regarder en termes de mécanisme sous-jacent: lorsque git crée un nouveau commit, les étapes utilisées pour mettre à jour HEAD vont comme ceci:1

  1. Lire le contenu du fichier HEAD.
  2. Est-ce une référence symbolique telle que ref: refs/heads/master? si oui, passez à l'étape 4.
  3. Non (cas "HEAD détaché"): créez un commit avec le parent donné par l'ID de commit dans HEAD et écrivez le nouveau SHA-1 dans HEAD. Arrêtez, nous avons terminé.
  4. Lire SHA-1 de la branche référencée (par exemple, .git/refs/heads/master, ou à partir de références emballées).
  5. Si aucun SHA-1 n'est disponible car la branche n'existe pas encore, créez un commit racine, sinon créez un commit dont le parent est le SHA-1 donné. Écrivez le nouveau SHA-1 à la branche référencée. Arrêtez, nous avons terminé.

Remarque intéressante, lorsque les références sont compressées, les références "actives" (comme la branche sur laquelle vous développez, disons devel par exemple) se retrouvent dans .git/packed-refs, mais sont rapidement mis à jour avec de nouvelles valeurs. Ces nouvelles valeurs vont uniquement dans le .git/refs/heads/devel fichier: le .git/packed-refs le fichier conserve un refs/heads/devel entrée, mais périmé (et donc ignoré). (Vous n'êtes pas censé dépendre de cela: les programmes externes, tels que les scripts Shell, devraient utiliser git branch ou git update-ref ou git symbolic-ref le cas échéant, pour lire et écrire les noms de référence et les valeurs SHA-1. Parfois, cependant, il est utile de pouvoir entrer et modifier directement les références. Considérez-le comme l'équivalent moderne d'un éditeur hexadécimal pour les secteurs de disque. :-))


1Tout cela suppose que vous ne créez pas de validation de fusion. Si vous êtes au milieu d'une fusion, un autre fichier du référentiel (.git/MERGE_HEAD) fournit les ID parent de fusion supplémentaires.

40
torek

Bare git repos (repos créé en émettant git init --bare) n'aura pas d'arbre de travail attaché. Ce que vous pouvez faire, c'est aller sur le repo /.../git/new_proj.git et ajoutez le dépot nu que vous avez créé en tant que télécommande: git remote add bare_Origin <link to bare repo> puis essayez de pousser vos validations vers ce bare_Origin forme repo là-bas.

De plus, avez-vous une raison particulière de créer un référentiel nu au lieu d'un référentiel normal?

2
gravetii

j'ai le même problème et corrigé - tout d'abord utilisez la commande git add après cette commande use commit enfin utilisez la branche git pour montrer votre version branchée de mon git 1.9

git add -A
git commit -m "initialize"
git branch
2
Bafi