今回はGitを使用しTwinCATプロジェクトを管理する方法を紹介します。TwinCATプロジェクトはVisual studioに統合されるので、一般的なSoftware Source Controlツールを使うことができます。もちろん世の中にVersion Dogなど複数のPLCメーカプロジェクトを管理するツールもありますが、色々なツールを使ってみてどれが自分に合うのか考えましょう。
Before Git..
プログラムで合同作業や編集するときは、どのようにしていますか?
多分よくやるのはFileのままCopyし名前を日付けなどを追加するんですね。でもその方法だとCopy作業は大変だし間違えやすい。
さらに、下図のように名前のルールも明確に決まってないままFileをServerに上げるとどれが最新か、なにか違うのかわかりません。あと、よくあるのは二人で同時に同じのFileを編集してるとき、最初に編集した人の変更内容をそのまま知らずに上書きしてしまうこともよくあります。
そこに出てくるのはGitです。
What is Git?
私の説明は、Wikiに任せます。
https://ja.wikipedia.org/wiki/Git
Gitは、プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。Linuxカーネルのソースコード管理に用いるためにリーナス・トーバルズによって開発され、それ以降ほかの多くのプロジェクトで採用されている。Linuxカーネルのような巨大プロジェクトにも対応できるように、動作速度に重点が置かれている。
もっと詳しく知りたい人:
https://backlog.com/ja/git-tutorial/
Gitとは分散型バージョン管理システムの一つで、本来LinuxのSoruce CodeやFileを効率的に管理するためのツールです。そのGitはFileを更新履歴、いつでも保存したり、過去の状態に戻ったり、その履歴と違う部分を比較することもできます。
あと、一番悩むFile上書きされる問題も、もし他のTeam memberが最新Fileを上書きするとき、サーバーからWarningを出します。それにより、書かされる問題も解決されます。
KeyWord
まず今回Gitを導入するにはいくつか頻繁に使う言葉を紹介します。
Repository
リポジトリとは、ファイルやディレクトリの状態を記録する場所だけではなく、内容の変更履歴として格納されています。そして管理したいFolderをリポジトリに置くと、そのFolder内にものの変更履歴を記録することができます。
リポジトリにはリモートとローカルがあり、リモートはリポジトリをサーバーにおき(Githubとか)複数の人と共有することできます。ローカルは自分のPCに置くリポジトリです。
Commit
FileやFolderの変更、追加のたびに、リポジトリに記録することをコミットといいます。コミットすると、リポジトリの中に前回コミットした時の状態と現在の状態の差分を表すリビジョンというものが作られます。
Stage
Stageは特定の変更内容をIndexに登録するという意味で、つまりこのCommitと関係ない変更を無視するってことです。
Push
Local リポジトリをサーバーにUploadする動作です。
pull
サーバーにあるリポジトリをLocalにDownloadする動作です。
Branches
ブランチとは変更履歴の流れを分岐して記録するもので、分岐されたブランチは他のブランチの影響を受けないので、同時に複数のリポジトリに変更することが可能です。ソフトウェアの世界では複数のエンジニアが同時の機能追加がよくあることです。
Revert
RevertとはいまのCommitを取り消す動作です。
CherryPick
cherry-pickは、ほかのブランチから今いるブランチにコミットします。
Merge
分岐のブランチに行った変更をmasterブランチに統合する動作です。
.gitignore
Folder内でGitから管理されたくないBlacklistです。
Git Install
ではGit Installからはじめましょう。
Practice with Visual studio
いきなりTwinCATでやる!のは難しいので、Visual studioから簡単なProjectを練習しましょう。
Setup
Tools>Optionsします。
Source Control>Current source control plug-inをGitにします。
Source Control>Git Global Settings>UserNameなども設定してください。
Visual StudioにGitが出てきました。
New Repository
次は新しいRepositoryを作成します。
File>New>Repository
今回はLocal だけなので、Local Only>Local pathでRepository Path設定してください。
New Project
次はRepositoryに履歴管理されたいProjectを作成します。
File>New>Project
練習だけなので、Console Application>Console Applicationを選び、Nextします。
先に作成したRepositoryに新規作成するようにします。
そのままCreateでよいです。
それで簡単なConsoleプログラムが自動作成されました。
Activate Useful WorkSpace
いくつかよく使うViewがあります。
View>Git ChangesはCommitやMergeなどのときに使うんです。
View>Git Repositoryでいまの履歴やBranchなど一覧できます。
Your First Commit!
では、はじめのCommitをやりますね。
Git ChangesのViewに切り替えます。
どこに変更点があったか一覧できます。
Commitするには必ずMessageが必要です。
そのMessageはどんな変更をしてたかを説明するんです。
決まりがあるようなので、GoogleでGit Commit Formatを検索してください。
+ボタンをクリックします。
そうすると、いまの変更はすべてStaged changesに移行します。
Commitする変更項目もStagedしましたので、次はCommit Messageですね。
ここで簡単なInitを入れ、Commit StagedボタンをクリックRepositoryにCommitします。
これだけです。おめでとう!完成しました。
View the History
Commitされた内容を確認しましょう。
Git>View Branch History
もちろん、右クリック>Git>View HistoryでもOKです。
いままでどんな変更あったか一覧できますね。
Commit Some Changes
Hello worldのプログラムにもう少しコードを追加します。
Git>Commit or stashします。
変更ありのところ右クリック>Compare with Unmodifiedをクリックします。
そうするとなにか変更されたか明確に示されています。
+でStage Allします。
Commit成功しました。
履歴をみますと、先の追加履歴が表示されましたね。
Compare with Previous Version
今度は履歴の比較を行います。
これも大事な機能ですね。
履歴のところに右クリック>Compare with Previousします。
そうすると一つ前の変更履歴となにか違うのか明確に表示されます。
Revert
次は最後のCommitを一旦破棄する操作をします。
まずいくつかのLineを追加し、Commitします。
さらにLineを追加し、Commitします。
履歴ではいま2つの変更履歴がありますね。
Line2、Line3 is addedのところに戻りたいので、その変更履歴を右クリックしRevertします。
そのCommitにRevertしますか?
Yes.
そしてConflictsがあると言われますね。
Unmerge Changesのところに右クリックしCompare Current and Incomingでなにか違うか見えます。
問題なければ、Take Incoming(Soure)します。
そうすると、最後のCommitは破棄され、戻りますね。
Cherry Pick
次はCherry Pickをしてみます。
先の操作でプロジェクトはRevertしましたね。
いまは最後の履歴に右クリックし>Cherry-Pickクリックします。
Gitはプロジェクト内の差分を取り変更してくれました。
Branches
今度はBranchesを作成します。
Git>Mange Branchesをします。
いまのRepositoryにあるBranchesを一覧できます。
もちろん、Masterしかないですね。
これから作ります。
Add Local Branches
Masterのところに右クリック>New Local Branch Fromします。
Brance nameはTeamAです。
そしてBased OnはいまMasterしないので、そのままでCreateします。
TeamA Branchが作成されました。
Commit from Local Branches
TeamAのBranchからプロジェクトを変更してみます。
プログラムでさらにいくつかのLineを追加しますね。
そしてCommitします。
履歴ではいまTeamAの変更が反映されましたね。
もちろんTeamAのBranchで変更されたものなので、当然TeamAにはその変更ありますね。
でもMasterのBranceはどうでしょう?
TeamAがCommitしてた変更がもちろん反映されてないです。
Merge
TeamAの変更をMasterに反映させるにはさらにMergeのStepが必要です。
TeamAのBranceに右クリック>Merge “TeamA” into “master|します。
Mergeしますか?Yes
そうすると。TeamAの変更とMasterの変更が統合されました。
変更履歴にもTeamAとMasterが同じLINEにあります。
MasterのBranceに切り替えますと、TeamAの変更にもちゃんと同じに反映されました。
Create Branches from other Branches
次はTeamAのBranchの中にさらにBranchを追加しますね。
TeamAを右クリックし>New Local Branch Fromをクリックします。
Base onのところにTeamAを設定します。
それでCreateします。
TeamAClass1が作成されました。
次はそのBranchからさらにコードを修正します。
そのBranchからCommitします。
teamAとBranchは統合されていませんので、当然変更は反映されないんです。
同じくMasterも、です。
Merge
TeamAをCheckoutしてる状態で右クリックし>Merge TeamAClass1 Into TeamAします。
統合しますか?Yesします。
いまはTeamAClass1の変更がTeamAに統合されました。
いまTeamAのBranchにTeamAClass1の履歴変更が反映されました。
でもMasterとTeamA統合されていませんので、Masterはまだそのままです。
同じく、TeamAをMasterに統合します。
Yesします。
Branch Historyからみると、3つのBranchにも同じのCommitにいますね。
MasterのBranchにも反映されました。
Play with TwinCAT!
練習はここまでですね。これからTwinCATでやりましょう。
File Structure in TwinCAT Project
こちらはTwinCAT Project各Fileの役割です。
Setup in Visual Studio
TwinCATでGITするには設定を変更する必要があります。
Tools>Optionsします。
もう一度Source Control>Plug in SelectionがGitを選択しているかどうか確認しましょう。
次はTwinCAT>XAE Environmrnt>File Settingsをします。
その設定ではTwinCAT内のAxisやプログラムを複数として保存するかどうかの設定です。
Gitに対応するにその設定が必要です。
もちろんそのように個別のObjectを右クリック>Independent Project Fileでも同じです。
新しいProjectとRepositoryセットしたあとに、Axis、POUなどは全部青いICONついてるだけではなくFloppyのICONもついています。
次はPLC ProjectのInstanceをクリックします。
ObjectでKeep Unrestored Link InfoのCheckboxを入れます。
Setup in TCCompre
先Visual StudioからCodeの変更を比較しましたね。
TwinCATのST CodeなどはXML Formatなので、そのまま比較しても意味がないです。
そこでVisual StudioとTwinCAT project compareを連携することができます。
まずTask barからTwinCATのIconを右クリックし>Tools>TwinCAT Project Compareを起動します。
そしてTools>Configure User Toolsします。
Export Configurationをクリックします。
PluginでGITを選びます。
もしConfiguration FileがあればConfig is found!というメッセージが出てきます。
New Repository
TwinCAT用のRepositoryを作成します。
GitがIDEで表示されてるはずです。
Git>Create Git Repositoryします。
Pathを設定します。
Commit!
では実際にCommitしてみましょう。
変更された場合は小さいな赤Markついています。
右クリック>Git>Commit or Stashします。
このあたりの操作は、もう先の練習では変わりませんので詳しく説明しません。
CommitしたらView Historyを確認します。
よしこれでOKです。
Fatal Error
最初にCommitするとき、一回も成功したことなく、ずっとFatel errorが出てきます。
What Happen?
原因を調べたいので、Repositoryのところで右クリック>Git Bash Hereします。
git status
.project.*.project.~u のFileがずっと更新されていますね。
このFileはTwinCAT ProjectのBackup FileなのでCommitするときそのFileの変更を無視したいです。
Add .gitignore File
RepositoryのFolderに.gitignoreのFileを追加します。
中に以下を記述してください。
参考LINK:
https://alltwincat.com/2021/05/16/official-gitignore-for-twincat-3-on-github/
# TwinCAT files *.tpy *.tclrs *.compiled-library *.compileinfo *.project.~u *.tsproj.bak *.xti.bak /TwinCAT Project1/TwinCAT Project1.project.~u~parent of 2dcc9fc (ok) |
次はTools>Optionsします。
Source Control>Git Repository Setting>Git FilesのところにIgnore fileが認識されるようになります。
Editボタンをクリックすると同じ記述が見られます。
If Git can not refresh..
もし.gitignore が反映されないのであれば、以下のコマンドでCashを一回消しましょう。
git rm -r –cached . |
Finally
それでみなさんもう無事にCommitできると思います。
What About the TCCompre?
先ほどTCCompreを設定しましたが、実際どこで使うのでしょうか。
Commitするときに右右にある、Mのボタンをクリックします。
M:変更
A:追加
D:削除
R:ファイル名の変更
になります。(これはGitの標準ものでTwinCATだけではありません)
ちゃんとST Editorでなにか違うのか示してくれましたね。
こちらのCompare with UnmodifiedだとXML Formatになりますので。
なにが違うのかわかりにくくなります。
Finally
最後になりますが、もしなにか問題あれば遠慮なくいってくださいね。