我曾考虑在 Ubuntu 服务器上启动 git 服务。但是,我和另一位程序员的操作方式是——我们确实希望每次只让一个人负责一个项目。
我该如何编写 Bash 脚本来使用 git 创建签入和签出?我们希望防止任何人签入尚未签入的代码,并且应该错误地显示签出代码的人员的姓名。
编辑:我对使用 Git 及其出色的 diff 功能并不感兴趣。我工作节奏很快,没有时间与其他开发人员玩 diff 游戏。这就是我们使用 Git 的原因。如果其他开发人员想玩 diff 游戏,他们仍然可以玩。但当我签出某些内容时,我希望将其锁定给所有人,直到我再次签入。
答案1
但是当我签出某些内容时,我希望它对所有人都锁定,直到我再次签入为止。
呃......抱歉,DVCS(D 表示“分布式”)的工作方式根本不是这样。
a/ 您不需要“签出”文件(例如,在 ClearCase 中)。您只需开始修改它,Git 就会检测到更改,将其作为索引(git add
)和提交(git commit
即“检查”部分)的候选对象
b/ 当您“签出”(即修改)或检查文件时,其他开发人员及其相关的其他存储库对此一无所知。
您“锁定”了所有人,使所有人都无法访问您的存储库并修改您的文件。
但是当你发布(即推送这些更改)时,然后您需要解决任何并发修改。在 DVCS 中,没有能够检测并发更改和/或记录“锁定”的中央引用。
答案2
这并不是 git 的设计工作方式。也就是说,它不是典型的 git 工作流程。如果您确实想要这种工作流程,请考虑使用围绕这种工作流程构建的东西,例如 SubVersion。如果其他人想要该文件,但您拥有该文件,则锁定的文件会发出通知:
http://svnbook.red-bean.com/en/1.5/svn-book.html#svn.advanced.locking
我不知道 git-svnserver 网关是否支持锁定,但它可能支持。如果支持,那么你就可以两全其美了。
但是,Git 非常灵活。如果你想要更灵活,它会支持这一点。Git 允许你盲目地清除在你使用文件时可能发生的任何其他人的更改。每次你想推送到主存储库时,只需执行以下操作:
git pull --strategy ours ; git push
不需要该合并功能。
这对命令将把你的更改推送到服务器,忽略自上次同步以来其他人所做的任何更改。
另一个需要考虑的选项是“git pull --strategy recursive -Xours”。
答案3
与其他程序员沟通是一种选择吗?对于一个小团队来说,这几乎肯定是一种比依赖锁定更好的方法。
如果你坚持使用锁定,Git 的分布式模型并不合适。你应该考虑使用集中版本控制系统,如 SVN。这允许您锁定存储库中的文件。当您的同事程序员尝试提交到存储库时,他/她将收到警告。
答案4
你真的不需要这个。Git
其他好的源代码控制系统已经足够好地处理合并,你不需要在签出时锁定文件。相反,确保你经常提交并定期将更改推送到上游。
至于编写 bash 脚本来签入和签出,您可以像编写其他脚本一样编写 bash 脚本……只需一系列命令,就像您在命令行上运行它们一样,但您再次不需要这样做。您只需要一个命令来更新本地存储库,一个命令来提交,一个命令来推送上游。您应该先学习 git,然后在发现自己作为单个命令运行的任务很繁琐时再考虑编写脚本。