2013-02-18 7 views
22

KontextVerknüpfen git verpflichtet mit dem Team Foundation-Workitems

Eine GitHub Enterprise-Installation für die Entwicklung verwendet. Jeder Entwickler hat sein eigenes öffentliches Repo, und die Organisation hat das autorisierende Repo. Pull-Anfragen werden für Code-Reviews verwendet, und wir folgen lose dem git flow Verzweigungsmodell von nvie.

Eine TFS-Installation, die für die Fehlerverfolgung und -bereitstellung verwendet wird (der Versionszweig). Wir spiegeln den Release-Zweig in ein TFS Repo.

Work Items

Jetzt ist der schwierige Teil: Wie verbinden wir git Commits mit TF-Workitem (das ursprünglich kann auf den öffentlichen Zweig des Entwicklers durchgeführt werden)?

Was ich tat

Ich habe um Hilfe bei den folgenden Projekten sah:

Ich habe gelesen Referenz s, um Commits mit Arbeitsaufgaben in beiden Git-TF-Projekten zu verknüpfen, aber ich bin mir nicht sicher, welches Tool verwendet werden soll und wie genau es ausgeführt werden soll.

Ich wäre in Ordnung, wenn ich ein Skript auf die Freigabebranche Commits ausführen musste, um Arbeitsaufgabenreferenzen aus der Commit-Nachricht zu extrahieren und sie mit Changesets zu verknüpfen, die an TFS gesendet wurden. Eine Lösung, die die Zuordnung in Metadaten ermöglicht (anstelle von Commit-Nachrichten), wäre jedoch bevorzugt.

Welche Optionen habe ich, um Arbeitsaufgaben in TFS mit Git-Commits zu verknüpfen?

Antwort

18

Mit git-tfs können Sie Arbeitselemente in einer Commit-Nachricht unter Verwendung von metadatas zuordnen (und sogar Commit-Richtlinie erzwingen!).

Sie automatisch zugeordnet werden, wenn die Festschreibung in dem TFS-Server durchgeführt werden (wenn Sie die rcheckin command)

Und es gibt sogar eine git-Note auf dem git erstellt begeht den Titel des workitem haben und ein Link zum Workitem!

Aber um Rcheckin in einem Synchronisationsprozess zwischen Git und TFS zu verwenden, sollten Sie vor (absolut) verstehen, wie es funktioniert!

Wenn Sie git commits in TFS überprüfen, erstellen git-tfs für jeden Commit das entsprechende Changeset in tfs und holen den Inhalt dieses Changesets, um ein git commit neu zu erstellen. Also, selbst wenn es (fast) unsichtbar für dich in einem normalen Arbeitsablauf ist, hast du die git commits nach dem rcheckin, die nicht die gleichen sind wie die ursprünglichen (es gibt eine Modifikation des Verlaufs!).

Das könnte ein großes Problem sein, wenn dieses git reporitory zum zentralen Repository wird, da jeder Commiters eine Rebase durchführen muss. Ansonsten sollte es kein Problem sein, da es komplett transparent ist, außer in Sonderfällen aber leicht lösbar.

keine perfekte Lösung ...

+1

Interessant. Präziser als meine Antwort. +1 – VonC

+0

Git tfs ist schnell und mehr Feature-Comple aber sehr zerbrechlich, während ms git tf begrenzt ist, aber es ist felsenfest. – regisbsb

+0

@regissb Falsch! Ich bin mir ziemlich sicher, dass git-tfs genauso zuverlässig ist wie git-tf bei den Dingen, die git-tf macht. Die einzige Sache ist, dass git-tfs versucht, Zweige zu unterstützen, an die git-tf überhaupt nicht gedacht hat, weil die TFVC-Zweigunterstützung die schlimmste Unordnung ist, an die man nicht einmal denken konnte. Jedes Mal, wenn ich einen Edge-Fall unterstütze, gibt es einen noch alberneren zu unterstützen! Wenn Sie so zuverlässig sein möchten, verwenden Sie einfach die Option "--ignore-files". Das ist es! – Philippe

6

Ohne viele Informationen über diese Git-TFS-Tools mit, beachten Sie, dass Sie jederzeit Metadaten zu einem commit (ohne Änderung der Geschichte/SHA1 des Repo) durch Hinzufügen von Notizen hinzufügen können.

Siehe git notes (oder Git Tip of the Week: Git Notes).

Durch Hinzufügen dieser Informationen in einem dedizierten "Notiz-Namespace" können Sie schnell Informationen wie eine Arbeitsaufgabenreferenz aus der Notiz speichern und abrufen, die einem Git-Commit zugeordnet ist.

+0

Danke, ich weiß, über git Notizen, und ich denke, das nodirt Git- TF-Projekt verwendet sie. Das ist jedoch nur ein Teil der Antwort. – Wilbert

21

Wenn Sie Nachricht # in Ihrem git commit verwenden, wie in git -m'fixes 123' # commit TFS wird die angegebene als verknüpfte Element in workitem commit automatisch hinzuzufügen.

+1

Ja, das wurde in die neueste Version eingeführt, und es führt zu Problemen ohne Ende, da wir tausende von Commits haben, die das Ergebnis akzeptierter Pull-Requests sind, die 'Pull Request # 142' im Titel zusammengeführt haben. Das bezieht sich offensichtlich auf GH: E Pull-Request-Nummern und nicht TFS-Ausgaben. – Wilbert

+4

@Wilbert Es gibt eine Möglichkeit, das zu vermeiden: [Anfrage zusammenführen] (https://github.com/git-tfs/git-tfs/pull/513) & [doc] (https://github.com/ git-tfs/git-tfs/blob/master/doc/spezial-aktionen-in-commit-messages.md) – Philippe

3

Sie sollten in der Lage sein, es in der ms git tf zu tun:

git tf checkin --associate=27631,27637

Hilfe sagt:

usage: git-tf checkin [--help] [--quiet|-q|--verbose] [--message|-m=<msg>] [--metadata|--no-metadata] [--renamemode=<all|justFiles|none>] [--deep|--shallow] [--squash=<commit id>|--autosquash] 
[--resolve=<workitem id>] [--associate=<workitem id>] [--mentions] [--no-lock] [--preview|-p] [--bypass|--gated|-g=<definition>] [--keep-author|--ignore-author] [--user-map=[<file path>]] 

Arguments: 
    --help    Displays usage information 
    --quiet, -q, --verbose 
          Determines the output detail level 
    --message, -m=<msg> Use the given <msg> as the changeset comment 
    --metadata, --no-metadata 
          Determine whether to include git commit meta data in the changeset comment when checking in deep. If omitted, value provided during configure is used. 
    --renamemode=<all|justFiles|none> 
          The rename mode to use when pending changes. Specify either "all", "justFiles" or "none" (default: justFiles) 
    --deep, --shallow Creates a "deep" check-in, checking in a TFS changeset for each git commit since the latest TFS changeset(requires linear history or "--squash" or "--autosquash"), or 
          "shallow", checking in a single changeset for all commits.If omitted, the depth value provided during clone or configure is used. 
    --squash=< commit id>, --autosquash 
          Specifies how check in should operate in the deep mode if one commit has more than one parent 
    --resolve=< workitem id> 
          ID of the TFS work item to resolve during check-in 
    --associate=< workitem id> 
          ID of the TFS work item to associate during check-in 
    --mentions Add references in the commit comments for any work items linked to the corresponding changeset. 
    --no-lock    Does not take a lock on the server path before committing (dangerous) 
    --preview, -p Displays a preview of the commits that will be checked in TFS 
    --bypass, --gated, -g=<definition> 
          Bypass gated check-in or specify a gated build<definition> to use 
    --keep-author Use the commit author as the changeset owner when checking in deep.The commit author should be known to TFS either by his name or e-mail address.To use this option you should 
       be either a TFS project administrator or have the "Check in other users' changes" permission. 
    --ignore-author Use the current authenticated user as the changeset owner. 
    --user-map=[< file path >] 
          Specifies an absolute or relative path to a file providing mapping between Git repository commit authors and TFS user identities. (default: ./USERMAP) To generate a template 
          mapping file, run the checkin command in preview mode with the --keep-author and --deep options specified. 

Creates a check-in of the changes in the current master branch head, provided it is parented off a commit converted from a TFS changeset. 
Verwandte Themen