ローカル(特にWindows)を含め、どのようにgitの動作を強制していますか?


13

この.NETショップをsvnからgitに移行することに焦点を当てており、スイッチを切り替える前に解決策を見つけたいと思ういくつかの付随的な問題を特定しました。

この質問で特に質問しているのは、行末強制です。デフォルトでは、Windows用のgitは 'checkout crlf、commit lf'でインストールされます。これは、crlfの末尾のみで構成される(私が知る限り)ソースの束に対しては機能しません。

私は与えられた開発者が指示を与えられてもこれを正しく設定することを盲目的に信頼していることを知らないので、次のいずれか(または両方)を検討していますが、ここの誰かが別のルートを行った場合は興味がありました。

  • lf行の末尾(またはすべてのlf行の末尾)をチェックし、そのイベントで拒否する事前コミットフック。
  • グローバル設定に「現状のまま」を設定する、開発者に配布されるインストールスクリプト。

PSこれを書いているときに、svnからgitへの最初の変換がデフォルトの方法をコミットする可能性があり、人々がデフォルトに固執している限り、それもかなりシームレスです。デフォルトではない「現状のまま」でgitをインストールした.NETショップでgitを使用して開発者だったので、私もそこに自分の問題を作成しました(到着する前にすべてデフォルトになりました) 。ですから、私はまだ何らかの強制メカニズムに傾いています。


2
事前受信フックサーバー側では、これは処理可能でなければならず(crlfの終了を確認し、そうでない場合は失敗します)、更新フックを使用すると、事前マージも更新できるはずです。どのタイプのgitサーバーを使用していますか?これをワークステーション側で行う必要がある場合、構成マネージャーを使用する方法がありますが、より難しく、多くの欠点があります。ラストリゾートは、CIに毛羽立ちや手順に従うために人々を強制するために失敗している
Tensibai

1
私はテンシバイに同意し、あなたが選択するオプションは、これが実施されるべきだとあなたがどれほど厳しく信じているかに基づいているべきであると付け加えます。厳密な実施のためのコミット前のフック、コミット後のコンプライアンスレポートのリント。
デイブSwersky

デイブに感謝します。クライアント側/より厳格な施行の私の理論的根拠は、私にとって全体的な作業が少なくなり、エラーをより早く発見できることです。開発者のワークステーションをCMに移動するのではなく、開発サーバーはすべてDSCにあるため、追加するのは簡単です。編集:@Tensibaiにも感謝します...クライアント側に見られる欠点について詳しく説明していただけますか?
ndarwincorn

1
主にグローバルフッククライアント側を強制する場合、lf終了を必要とするプロジェクトでの作業を妨げることになります。そして、なんらかの方法で設定する必要があります。全員が正しい設定に従うかどうかはわかりません。私は今考えていない他のフットガンがあると確信しています
天柴i

問題を解決するために何をしましたか?
ニュートピア

回答:


6

ローカルで何かを強制する方法の質問に答えるために、すべての開発者ワークステーションの状態を管理および強制することについて非常に重いリフティングをせずに行うことはできません。通常、開発者は開発のローカル管理者である必要があると思います彼らがそうでなければ、彼らはとにかくそれらの特権を取得する方法を考え出すのに時間を費やすからです。

それはおそらく、分散バージョン管理を使用する場合、ローカル構成の状態を気にする必要がないためです。構成の状態のみを考慮する必要があります。gitを一元化されたバージョン管理システムとして使用していると仮定します。これは基本的に誰もが最も簡単だからです。それから、「あなたの」設定が中央サーバーに保存されたコードのコピーであると仮定しましょう。

この場合、前述のようにcrlf / lfの行末を壊すマージを受け入れないでください。したがって、他のクライアントが変更をプッシュしようとすると潜在的に破壊的なスタイルの選択でレポを汚染する要求を拒否するサーバー側のロジックであなたを強制します。


4

メインの開発ブランチまたはマスターブランチにgithubでプルリクエストを使用するレビュープロセスが必要です。そのレビュープロセス中に、多くのファイルに空白または行末の違いがある場合、プルリクエストに変更が必要であるとマークし、プルリクエストを行うdevまたはmasterブランチのフォーマットに従うことを主張します。

また、使用する言語と使用するCIツールに応じて、ビルドプロセスまたはプルリクエストステップ中に、設定したルールに基づいてコードを自動フォーマットできる優れたツールもあります。また、コードの一貫性を保ち、コードをコミットする際のフォーマットの問題を最小限に抑えるのにも役立ちます。


使用しているツールについて詳しく説明しますか?これを達成する方法はいくつかあり、私たちは独自の方法を持っていますが、まだそのように実装していないことを考えると、どうやってそれを解決しているのでしょうか。
ndarwincorn

1
typescript、github、jenkinsを使用しています。Typescriptには、このタイプの素晴らしいエコシステムがあります。
avi

3

リポジトリごとの設定を使用して、リポジトリごとにユーザーの設定を上書きできます。中央ソースと見なされるリポジトリで実行されると、クローンで伝播し、ローカルリポジトリを含む他のリポジトリにプルされるため、ローカル設定が中央で上書きされます。

中央リポジトリのフックを使用してこれをさらに強制し、ファイルの末尾が本来の内容であることを確認し、コーシャでない場合はマージ/プッシュを拒否できます。ただし、これらのフックはリポジトリでは複製されず、少なくとも直接ではありませんが、ルールは中央リポジトリでのみ施行される必要があるため、これは必要ありません。

git initでテンプレートを使用すると、すべてのgitignore、gitattributesなどのファイルと同じようにリポジトリを作成できます。

最後に、あなたの質問に直接関係していませんが、svn saavyチームをgitベースのワークフローに連れて行くときに最大の摩擦ポイントを見つけました。この視覚的なキューシートは、どのコマンドがどの部分にどのような影響を与えるかを少し説明するのに役立ちました。

これが少し役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.