基于diff的模板/碎片控制工具
fragments的Python项目详细描述
碎片
==
[![构建状态](https://secure.travis ci.org/glyphobet/fragments.png)(http://travis ci.org/glyphobet/fragments)
fragments使用来自版本控制的概念来替代模板语言的许多用法。
它提供基于差异的模板语言,而不是修订控制,它提供"碎片控制"。rol"
片段是一个[干的(不要重复你自己](http://en.wikipedia.org/wiki/don't戋u repeat戋u yourself)违规管理器;
它是一个[多来源的真相](http://en.wikipedia.org/wiki/single戋u source戋u的真相)引擎。
什么是基于差异的模板?
--------
使用模板语言生成html是困难的,因为模板语言通常有两个半不兼容的目的。
第一个目的是跨多个模板管理常见的html元素和结构:页眉、边栏和页脚。
这有时被称为页"继承""
第二个目的是对来自另一个源的数据执行特殊的显示逻辑。
当这两个目的可以分离时,模板可以简单得多。
fragments使用diff和merge算法管理第一个目的,即公共html元素和结构。
实际的显示逻辑留给应用程序处理。"或模板语言,其模板本身由片段管理。
什么是片段控制?
--------
现代版本控制系统中已经存在管理多个版本的单个文件的公共和不同代码片段的机制。
片段使用这些工具来管理多个不同文件的公共和不同版本。
每个文件实际上都有自己的"分支"。",并且无论何时修改文件("分支"),都可以应用("合并")将其更改为您选择的任何其他文件("分支"。
在这个意义上,片段是另一种"源代码管理"--而不是随时间控制版本/修订,它控制多个同时存在的文件的片段。
因此,术语"fr"作为一个语言学家,我必须指出[共时性](http://en.wikipedia.org/wiki/synchronic_analysis)和[历时性](http://en.wikipedia.org/wiki/diachronics)语言学之间的区别首先给了我这个想法。
---------
merge算法是[precise codeville merge]的一个版本(http://revctrl.org/precisecodevillemerge),经过修改以支持樱桃采摘。
选择precise codeville merge是因为它支持[意外清除合并](http://revctrl.org/accidentalcleanmerge)和[聚合](http://revctrl.org/convergence)。
也就是说,如果两个文件以相同的方式独立修改,则它们会干净地合并在一起。
这使得添加新文件变得很容易;使用fragment的"fork"命令基于其他文件(或只是您的某个文件的"cp")创建新文件,根据需要更改它,并提交它。
对该f中任何未修改的公共部分的后续更改。文件或其同级文件将适用于整个存储库的其余部分。
————
内容的操作。
但是片段也不是特定于html的。
如果它有新行,片段可以管理它。
这意味着xml、css、json、yaml或任何编程语言的源代码,其中新行很常见(很抱歉,Perl)。
cFragments甚至足够聪明,能够知道不要将完全不同的文件合并在一起。
例如,您可以使用它来管理不同服务器和部署配置的大量配置文件。
或者您可以使用它来管理对在你希望不必维护的遗留项目中,不要弄乱重复的源文件。
----
片段没有历史记录;它只存储文件以前提交的状态。
存储历史记录取决于版本控制系统。
但是片段存储其存储库配置的方式允许版本控制系统轻松、明显地管理它。
配置存储在"碎片"目录中。
此目录名前面没有".",其中的所有文件都存储为纯文本。
您要确保从存储库根目录运行"碎片初始化",该根目录通常至少比实际的c内容。
否则,您的"碎片"目录可能会意外部署到生产环境或干扰模板加载程序。
ed一起使用。
invisibility
----
fragments对不知道正在使用的人是不可见的。
如果您(或其他人)对一个文件进行多个更改,fragments'`apply`命令允许您对更改执行基于块的交互式应用程序。,类似于"git commit--patch"或"hg record"。
因此,您可以将单个html文件提供给您的web设计师或初级程序员,让他或她根据需要修改它。
稍后,您可以有选择地将这些更改应用于所有其他html文件,而将其他更改只保留在修改文件。
installation
----
fragments是[在pypi上](http://pypi.python.org/pypi/fragments)。
您可以使用"pip install fragments"安装它。
用法
-
fragments安装"fragments"命令行脚本。
fragments的第一个参数是命令。
和版本控制一样,必须首先"$fragments init"存储库,然后"$fragments follow"一些文件,然后"$fragments commit"它们。
在某些情况下故意使用不同的命令名,以提醒您fragments不是版本C控制。
elp[command]`
display global help,或help for _command(如果指定)。
*`init[fragments_root]`
初始化新的片段存储库。
repository位于名为_fragments/`的目录中,该目录是在当前工作目录或_fragments_root创建的_如果指定。
*`status[[-l--limit]status][filename[filename…]`
获取片段存储库的当前状态,如果指定,则限制为文件名。
将输出限制为状态为文件的文件(如果存在)。
*`follow filename[filename…]`
开始更改一个或多个文件名。
*`忘记文件名[文件名…]`
>停止更改一个或多个文件名。
*`重命名旧文件名新文件名`
如果磁盘上的le尚未移动。
*`diff[[-u--unified]num][filename[filename…]`
显示提交版本和未提交版本之间的差异,如果指定,则限制为文件名。
`-u num`,`--unified num`要显示的上下文行数
*`提交[文件名[文件名…]`
_文件名(如果指定)。
*`revert[filename[filename…]`
将更改还原到片段存储库,如果指定,则限制为文件名(如果指定)。
*`fork[[-u--unified]num]source\u filename[source\u filename…]target\u filename`
_基于一个或多个源文件名的目标文件名。
保留较大的公共节;
对于每一行或每一个冲突,用一个换行符替换不同节以及不同节之间短于行数的公共节。
*`apply[-i-a][-u|--统一]num]源文件名[目标文件名[目标文件名…]`
在可能的情况下应用自上次提交后对源文件名所做的更改。
如果指定,则将应用程序限制为目标文件名。
将跳过所有冲突的文件ed.
较小的冲突将作为冲突部分写入文件。
`-i,--交互式`交互选择要应用的更改
`-a,--自动`自动应用所有更改
`-u num`,`-统一num`要显示的上下文行数
在交互模式下,您可以使用以下命令:
*`y`包含此更改
*`n`不包含此更改
*`a`包含此更改和所有剩余更改
*`d`完成,不包含此更改或任何剩余更改
*`j`保留此更改ange undecited,请参阅下一个未决定的更改
*`k`保留此更改未决定,请参阅上一个未决定的更改
*`?`交互式应用模式帮助
r压缩的css或javascript文件,或html中"onclick"属性中的内联javascript函数。
文件中的新行越多,合并的片段就越健壮。
接下来的所有文件可能会使片段的合并变得更加健壮。
预处理器将在"commit"、"fork"和"apply"之前运行,并且对于不同的文件格式将有不同的预处理器。
n mode for bash
*command line completion mode for zsh
*command aliasing and default configuration
*Pluggable diff&;merge algorithms,if they sulfy
credits
----
fragments是Matt Chisholm 2012版权所有,并在BSD许可下发布。
它[在github上](https://github.com/glyphobet/fragments)和[在pypi上](http://pypi.python.org/pypi/fragments)都是可用的。
非常感谢ross cohen对这个想法的思考,以及他为片段中使用准备了精确的codeville合并。
==
[![构建状态](https://secure.travis ci.org/glyphobet/fragments.png)(http://travis ci.org/glyphobet/fragments)
fragments使用来自版本控制的概念来替代模板语言的许多用法。
它提供基于差异的模板语言,而不是修订控制,它提供"碎片控制"。rol"
片段是一个[干的(不要重复你自己](http://en.wikipedia.org/wiki/don't戋u repeat戋u yourself)违规管理器;
它是一个[多来源的真相](http://en.wikipedia.org/wiki/single戋u source戋u的真相)引擎。
什么是基于差异的模板?
--------
使用模板语言生成html是困难的,因为模板语言通常有两个半不兼容的目的。
第一个目的是跨多个模板管理常见的html元素和结构:页眉、边栏和页脚。
这有时被称为页"继承""
第二个目的是对来自另一个源的数据执行特殊的显示逻辑。
当这两个目的可以分离时,模板可以简单得多。
fragments使用diff和merge算法管理第一个目的,即公共html元素和结构。
实际的显示逻辑留给应用程序处理。"或模板语言,其模板本身由片段管理。
什么是片段控制?
--------
现代版本控制系统中已经存在管理多个版本的单个文件的公共和不同代码片段的机制。
片段使用这些工具来管理多个不同文件的公共和不同版本。
每个文件实际上都有自己的"分支"。",并且无论何时修改文件("分支"),都可以应用("合并")将其更改为您选择的任何其他文件("分支"。
在这个意义上,片段是另一种"源代码管理"--而不是随时间控制版本/修订,它控制多个同时存在的文件的片段。
因此,术语"fr"作为一个语言学家,我必须指出[共时性](http://en.wikipedia.org/wiki/synchronic_analysis)和[历时性](http://en.wikipedia.org/wiki/diachronics)语言学之间的区别首先给了我这个想法。
---------
merge算法是[precise codeville merge]的一个版本(http://revctrl.org/precisecodevillemerge),经过修改以支持樱桃采摘。
选择precise codeville merge是因为它支持[意外清除合并](http://revctrl.org/accidentalcleanmerge)和[聚合](http://revctrl.org/convergence)。
也就是说,如果两个文件以相同的方式独立修改,则它们会干净地合并在一起。
这使得添加新文件变得很容易;使用fragment的"fork"命令基于其他文件(或只是您的某个文件的"cp")创建新文件,根据需要更改它,并提交它。
对该f中任何未修改的公共部分的后续更改。文件或其同级文件将适用于整个存储库的其余部分。
————
内容的操作。
但是片段也不是特定于html的。
如果它有新行,片段可以管理它。
这意味着xml、css、json、yaml或任何编程语言的源代码,其中新行很常见(很抱歉,Perl)。
cFragments甚至足够聪明,能够知道不要将完全不同的文件合并在一起。
例如,您可以使用它来管理不同服务器和部署配置的大量配置文件。
或者您可以使用它来管理对在你希望不必维护的遗留项目中,不要弄乱重复的源文件。
----
片段没有历史记录;它只存储文件以前提交的状态。
存储历史记录取决于版本控制系统。
但是片段存储其存储库配置的方式允许版本控制系统轻松、明显地管理它。
配置存储在"碎片"目录中。
此目录名前面没有".",其中的所有文件都存储为纯文本。
您要确保从存储库根目录运行"碎片初始化",该根目录通常至少比实际的c内容。
否则,您的"碎片"目录可能会意外部署到生产环境或干扰模板加载程序。
ed一起使用。
invisibility
----
fragments对不知道正在使用的人是不可见的。
如果您(或其他人)对一个文件进行多个更改,fragments'`apply`命令允许您对更改执行基于块的交互式应用程序。,类似于"git commit--patch"或"hg record"。
因此,您可以将单个html文件提供给您的web设计师或初级程序员,让他或她根据需要修改它。
稍后,您可以有选择地将这些更改应用于所有其他html文件,而将其他更改只保留在修改文件。
installation
----
fragments是[在pypi上](http://pypi.python.org/pypi/fragments)。
您可以使用"pip install fragments"安装它。
用法
-
fragments安装"fragments"命令行脚本。
fragments的第一个参数是命令。
和版本控制一样,必须首先"$fragments init"存储库,然后"$fragments follow"一些文件,然后"$fragments commit"它们。
在某些情况下故意使用不同的命令名,以提醒您fragments不是版本C控制。
elp[command]`
display global help,或help for _command(如果指定)。
*`init[fragments_root]`
初始化新的片段存储库。
repository位于名为_fragments/`的目录中,该目录是在当前工作目录或_fragments_root创建的_如果指定。
*`status[[-l--limit]status][filename[filename…]`
获取片段存储库的当前状态,如果指定,则限制为文件名。
将输出限制为状态为文件的文件(如果存在)。
*`follow filename[filename…]`
开始更改一个或多个文件名。
*`忘记文件名[文件名…]`
>停止更改一个或多个文件名。
*`重命名旧文件名新文件名`
如果磁盘上的le尚未移动。
*`diff[[-u--unified]num][filename[filename…]`
显示提交版本和未提交版本之间的差异,如果指定,则限制为文件名。
`-u num`,`--unified num`要显示的上下文行数
*`提交[文件名[文件名…]`
_文件名(如果指定)。
*`revert[filename[filename…]`
将更改还原到片段存储库,如果指定,则限制为文件名(如果指定)。
*`fork[[-u--unified]num]source\u filename[source\u filename…]target\u filename`
_基于一个或多个源文件名的目标文件名。
保留较大的公共节;
对于每一行或每一个冲突,用一个换行符替换不同节以及不同节之间短于行数的公共节。
*`apply[-i-a][-u|--统一]num]源文件名[目标文件名[目标文件名…]`
在可能的情况下应用自上次提交后对源文件名所做的更改。
如果指定,则将应用程序限制为目标文件名。
将跳过所有冲突的文件ed.
较小的冲突将作为冲突部分写入文件。
`-i,--交互式`交互选择要应用的更改
`-a,--自动`自动应用所有更改
`-u num`,`-统一num`要显示的上下文行数
在交互模式下,您可以使用以下命令:
*`y`包含此更改
*`n`不包含此更改
*`a`包含此更改和所有剩余更改
*`d`完成,不包含此更改或任何剩余更改
*`j`保留此更改ange undecited,请参阅下一个未决定的更改
*`k`保留此更改未决定,请参阅上一个未决定的更改
*`?`交互式应用模式帮助
r压缩的css或javascript文件,或html中"onclick"属性中的内联javascript函数。
文件中的新行越多,合并的片段就越健壮。
接下来的所有文件可能会使片段的合并变得更加健壮。
预处理器将在"commit"、"fork"和"apply"之前运行,并且对于不同的文件格式将有不同的预处理器。
n mode for bash
*command line completion mode for zsh
*command aliasing and default configuration
*Pluggable diff&;merge algorithms,if they sulfy
credits
----
fragments是Matt Chisholm 2012版权所有,并在BSD许可下发布。
它[在github上](https://github.com/glyphobet/fragments)和[在pypi上](http://pypi.python.org/pypi/fragments)都是可用的。
非常感谢ross cohen对这个想法的思考,以及他为片段中使用准备了精确的codeville合并。