簡體   English   中英

防止git提交者創建某些目錄

[英]Prevent git committers from creating certain directories

有沒有辦法阻止git提交者在存儲庫中創建目錄。

我們有一些開發人員錯誤地將文件放在目錄結構中。 應該在的文件

 a/b/c/file

最終進入

 a/a/b/c/file

我只是想阻止創作

 a/a/*

它需要明顯地發生,以便他們知道他們的文件沒有被提交......因此,簡單地忽略a/a/*是不夠的。

有沒有辦法做到這一點?

編輯

一些人指出,提交者應該“接受培訓”,不要這樣做。 那里有一些缺陷:

  • 提交者是人,犯錯誤; 培訓不會阻止這種情況發生
  • 這不是那種在培訓期間會留在新員工頭腦中的信息(等待細節)
  • 大多數情況下,這發生在從一個分支到另一個分支的合並期間,因此文件不是手動創建的,而是在更大的變更集中被拖過。

因此,需要一種自動化方法。

使用2x4線索的用戶教育應該是首選。 對於技術解決方案,您可以阻止它們使用合適的提交掛鈎在本地進行此類提交。 但是,它們可能也無法安裝鈎子。 因此,你只需要實現一個拒絕推送的鈎子。 您可以使用更新掛鈎執行此操作,該掛鈎可以在將提交寫入中央存儲庫之前拒絕提交。 這是一個這樣的鈎子腳本:

#!/bin/sh
#
# update hook - args: refname sha1-old sha1-new

ref="$1"
old="$2"
new="$3"
if [ -z "$ref" -o -z "$old" -o -z "$new" ]; then
  echo >&2 "usage: $0 <ref> <oldrev> <newrev>"
  exit 1
fi

for badpath in a/a a/z/x; do
  if git ls-tree $new:$badpath >/dev/null; then
    bogus=$(git ls-tree -r --name-only $new $badpath)
    echo >&2 "REJECTED DUE TO BOGUS PATH \"$bogus\""
    exit 1
  fi
done

exit 0

如果我們創建一個簡單的裸存儲庫並將其添加為hooks / update並使其可執行(在Windows上,我們不需要這樣做 - 無論如何都會執行鈎子)。 然后克隆存儲庫並添加一個禁止的路徑(如示例中的/ b / c /文件)。 這是我推送此提交時得到的結果:

C:\Users\Pat\AppData\Local\Temp\x\L>git push origin master
Counting objects: 9, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (7/7), 423 bytes | 0 bytes/s, done.
Total 7 (delta 0), reused 0 (delta 0)
remote: REJECTED DUE TO BOGUS PATH "a/a/b/c/file"
remote: error: hook declined to update refs/heads/master
To C:/Users/Pat/AppData/Local/Temp/x/R
 ! [remote rejected] master -> master (hook declined)
error: failed to push some refs to 'C:/Users/Pat/AppData/Local/Temp/x/R'

這說明了兩件事。 首先,這些鈎子腳本實際上非常簡單,可以在一些臨時存儲庫中創建和測試。 您回顯到stderr或stdout的任何內容都會被復制到推送用戶。 第二 - 這也適用於Windows(至少在使用Git for Windows時)。

提交鈎子在用戶本地存儲庫上工作並且不那么令人討厭,但是你有一個問題就是確保所有本地克隆都有正確的鈎子。 這在服務器端處理起來要簡單得多。

這將完成阻止創建子目錄a ,但它不是理想的,更好的答案可能是訓練:

ln -s . a
git add a
git commit -m "Create top-level self-referential symlink to stifle subdirectory creation"

子模塊(在評論中提出)是一個選項,但這不會阻止用戶創建a/a ,它可能只是阻止他推入不相關的目錄。

您可以創建一個git掛鈎,檢查文件夾a/a/是否放置了文件,如果發生這種情況則拒絕推送。 結帳git掛鈎: http//git-scm.com/book/en/Customizing-Git-Git-Hooks

你可能正在尋找pre-receive掛鈎。 然后,你只需要編寫自己的腳本 - 不應該太難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM