4

考虑一个 SVN 存储库,它有一个对生产非常重要的文件:

.
├── Makefile
├── README
├── config
│   └── system_configurations
│       └── IMPORTANT.conf
....

开发人员经常IMPORTANT.conf出于测试目的在本地进行更改,但不想意外提交。

有没有办法保护这个文件,以便提交它会显示某种警告或需要一些特殊的命令行参数?

我知道有一些架构解决方案(例如,LOCAL_IMPORTANT.conf在本地使用、符号链接等) - 我正在寻找来自 SVN 领域的解决方案。

4

5 回答 5

3

也许使用SVN锁机制?

http://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-dug-locking.html

这可能无法提供足够的保护,因为您可以“窃取”其他用户的锁,但它会阻止用户提交对特定文件的更改,直到他们窃取您的锁。

于 2012-04-29T08:10:26.627 回答
1

我会找到一种方法,您可以将 IMPORTANT.conf 完全排除在 SVN 之外,并让 CI 服务器将其从另一个位置复制到适当的位置——例如 IMPORTANT_Dev.conf、IMPORTANT_Prod.conf 等。

从技术上讲,您可以做一个 post-commit 钩子或 pre-commit 钩子来解析 IMPORTANT.conf 的提交详细信息,然后给开发者一巴掌,或者让提交失败,但使用源代码控制工具进行配置管理似乎有点过头了。

于 2012-04-29T07:57:36.783 回答
1

也许这不是最简单的解决方案,但绝对可配置且通用:

svn hook(在这种情况下是预提交钩子)
您可以自由使用不同的脚本语言,并且您可以使用预定义的提交注释来防止意外更改,例如:(
伪代码)

if(affected(important_file) && !commmentContains("IMPORTANT_FILE_CHANGE")) {
   return false;
}

您可以在 Google 上找到很多文章,但这里有一个示例:
http ://wordaligned.org/articles/a-subversion-pre-commit-hook

于 2012-04-29T08:07:40.717 回答
1

有很多可能的解决方案。我倾向于锁定(如 Khoi 所述)。在关键文件上设置 svn:needs-lock,然后让人们在他们实际需要更改的极少数情况下明确锁定它们。

http://svnbook.red-bean.com/en/1.7/svn.advanced.locking.html

另一种解决方案可能是通过 SVN 访问控制。SVN仓库如何访问?http 和 svn 访问都允许在路径上设置权限:

http://svnbook.red-bean.com/en/1.7/svn.serverconfig.pathbasedauthz.html

于 2012-04-29T08:47:02.343 回答
0

尝试忽略它

# ---------------------------------------------------------------------
#      Ignore all the .txt files in the /trunk/Blah/ directory
# ---------------------------------------------------------------------

# Go to the directory
cd trunk/Blah/              # The directory with the files

# Start editing the properties for the current directory
svn propedit svn:ignore .   # Opens an editor (SVN_EDITOR, EDITOR)

# Add the following value with a new line, save, and exit:
*.txt

# See that things worked
svn propget svn:ignore .    # So you can see the properties
svn status --no-ignore      # You should see an 'I' next to the ignored files

# Commit
svn commit -m "New Ignores" # You must commit the new property change


# ---------------------------------------------------------------------
#     Ignore a single file secret.txt in the /trunk/ directory
# ---------------------------------------------------------------------

# Go to the directory
cd trunk/

# Add just the single file to the current directories ignore list (like above)
# Note the dot at the end of the command is important
svn propset svn:ignore secret.txt .

# See that things worked
svn propget svn:ignore .    # Notice the single file was added to the list
svn status --no-ignore      # You should see an 'I' next to the ignored files

# Commit
svn commit -m "Its secret"  # You must commit the new property change

当你想提交它时,使用

svn changelist ignore-on-commit {file-you-want-to-add}

如果您想查找未版本控制的文件

svn status | grep ^\? | awk '{print $2}'
于 2012-05-01T22:16:45.110 回答