11
votes

Comment définir git_dir & git_work_tree lors de la maintenance de plusieurs référentiels

beaucoup comme Donc, post , j'ai le flux de travail suivant que j'aimerais entretenir avec Git:

  1. plusieurs personnes se développent localement
  2. commettre quelques choses
  3. commettre plus de choses
  4. pousser à la mise en scène
  5. Test Nouveau code sur la mise en scène
  6. poussez à la production

    Notre serveur de stockage sert de nombreux sites différents. Je voudrais configurer le référentiel pour chacun dans un dossier différent dans le répertoire de base d'un utilisateur. Chaque référentiel aura un crochet post-réception (ALA L'article Daniel Messier ) qui vérifie la Changements dans la racine Web de ce site / référentiel.

    Il est numéro six qui me donne des problèmes.

    Lorsque j'essaie d'exécuter des commandes git, je reçois l'erreur "Fatal: Cette opération doit être exécutée dans un arbre de travail". Je reçois cette erreur si je suis en train d'exécuter "statut git" dans le référentiel (/home/gituser/website1.git - que je ne crois pas devrait fonctionner de toute façon ..) ou de la racine Web (/ var / www / website1) .

    Cependant, si je spécifie le git_dir et git_work_tree, je suis capable d'exécuter des commandes git. Ces deux fonctionnaires: xxx

    donc j'ai besoin de:

    1. une alternative à la numération du répertoire et de l'arborescence de travail avec chaque commande
    2. Une alternative à la définition de variables d'environnement persistantes, car cela ne fonctionnerait que pour le site Web1, pas de site Web2, site Web3, etc.

      Suis-je à ce sujet correctement? Comment puis-je obtenir git les informations de répertoire dont il a besoin pour chaque référentiel?


0 commentaires

4 Réponses :


1
votes

Vous pouvez toujours appuyer sur la flèche vers le haut pour obtenir toutes ces informations, puis supprimez simplement la commande et remplacez-la par une autre. Vous ne devriez pas avoir besoin de retirer le tout.

Si vous avez émis un certain nombre d'autres commandes et que vous ne voulez pas trop "arrow" à travers l'historique, vous pouvez appuyer sur Ctrl-R et commencer à taper "arborescence" ou "travail". Vous devriez avoir le point de l'histoire où l'une d'entre elles était courue.

Sinon, le script définit ces variables comme déjà suggérées.


0 commentaires

3
votes

juste une suggestion.

Implémentez un fichier de script appelé "Git" qui est placé dans un répertoire qui précède le chemin de l'utilisateur avant l'exécutable GIT IN / USR / BIN. Git, le script Shell, est juste une mince emballage sur / usr / bin / git. La première chose à faire est de détecter quel répertoire git est appelé et essaie de déduire automatiquement ce qui se reproduit dans lequel il travaille. Peut-être en ayant un fichier "my.config" dans la racine de chaque référentiel que le script peut lire. Ensuite, le script appelle "/ usr / bin / git --git-dir" et définit git_dir et git_work_tree vars, puis appelle / usr / bin / git avec les mêmes paramètres de ligne de commande.


1 commentaires

ooh, j'aime cette idée. Malheureusement, je ne suis pas bon pour écrire des scripts shell. Petite aide? :)



17
votes

Si je comprends bien, vous avez un référentiel différent pour chaque racine Web. Si tel est le cas, vous pouvez définir l'arborescence de travail au niveau du référentiel (dans le fichier .git / config ): core.worktree . Il ne fonctionnera pas si le repo est configuré comme nu : xxx

une fois que c'est défini, des commandes git (comme statut GIT ) Travaillez à nouveau sur le dossier de référentiel et toutes les commandes qui utilisent l'arborescence de travail ( Statut GIT , GIT Checkout , etc.) utiliseront le Core.worktree Emplacement. (Notez que les commandes GIT ne fonctionneront toujours pas de l'emplacement de l'arborescence de travail, car ce n'est pas un référentiel.)


1 commentaires

Merci. J'ai déjà essayé l'approche Config. Handworktree, mais je n'avais pas remarqué que Bare = Vrai.



2
votes

trois options:

1) Ajouter un alias local: h2>

$ git config alias.root '! PWD' code> p>

2) Ajouter Un alias global ($ home / .gitconfig): h2> xxx pré>

3) un script, Findgitroot.sh, par exemple H2>
#!/bin/sh
f () { [[ -d ".git" ]] && echo "Found git in [`pwd`]" && exit 0; cd .. && f;}
f


4 commentaires

Désolé d'être un idiot total ici - l'option 1, est-ce qu'un extrait pour .bash_profile ou git config? Merci encore de fournir quelques exemples à ce problème.


L'option 1 sera pour GIT CONFIG. Cependant, depuis lors, j'ai trouvé beaucoup d'autres options meilleures: 3) git config alias.root '! PWD' (cela vous donnera la commande "git root" avec les résultats souhaités) 4) Git Rev-parse --Show-toplevel


Merci! Donc, pour 3), vous utiliseriez Git root commit -am "commettez msg" au lieu de git commit -am "commett msg" .


Umm. non. Vous utiliserez ce nouvel alias pour trouver simplement où la racine est directement, comme celle-ci: «$ root git 'ou' CD racine gitère etc.