我是Git的新手,想知道如何最好地处理重复文件。
假设我有以下Git目录结构:
myProject/
myProject/Server/
myProject/AndroidApp/
Server /和AndroidApp /都有一些共享文件(例如MyUtilities.java)。我认为共享文件集足够小,可以排除为它们创建单独的包或目录。现在,我真的不想为每个文件创建两个副本,但实际上Server / MyUtilities.java必须与AndroidApp / MyUtilities.java相同。我该怎么办?
答案 0 :(得分:3)
如果它们是同一个文件,您可能最好从一个文件中创建符号链接:
Linux / OSX中的示例
ln -s myProject/Server/MyUtilities.java myProject/AndroidApp/MyUtilities.java
答案 1 :(得分:1)
你应该按照你自己说的做法:为公共文件建立一个单独的目录。
或者您可以尝试在内置重复数据删除的文件系统上运行Git!
答案 2 :(得分:1)
您应该根据项目的结构来管理它,而不是Git将如何处理它。
您应该问自己的第一个问题是:如果您对myProject/Server/MyUtilities.java
进行了更改,您是否总是希望对myProject/AndroidApp/MyUtilities.java
进行相同的更改?
如果是这样,那么它们在逻辑上是一个在两个不同位置使用的文件,你应该把它放在一个公共区域并从你需要的地方引用它。
你可以稍后改变主意;如果你发现AndroidApp
需要不同版本,你可以随时移动。
正如我所说,不要担心Git。在内部,Git存储库中的文件根据其内容进行存储;文件名是文件内容的sha1校验和。 (它不是那么简单,但几乎是如此。)如果两个文件恰好相同,Git将存储一个副本并根据需要引用它。如果您更改了一个副本,则会更新引用 - 但您仍可访问的旧版本仍然引用一个副本。当然,你的工作区域有两份,但Git本身只存储一份。
符号链接是一个诱人的想法,它们肯定是有用的(Git确实处理符号链接),但我认为存储文件的两个副本或将一个副本放在一个公共目录中可能会更好溶液
编辑:为了澄清我的建议,我认为最好的方法是只拥有一个逻辑文件的副本 - 没有重复文件,没有符号链接。
例如,您可以创建一个包含Common
的新目录MyUtilities.java
:
myProject/Common/MyUtilities.java
myProject/Server/ServerFoo.java
myProject/AndroidApp/AndroidBar.java
我并不熟悉Java,但我认为它为您提供了一些方法来引用另一个文件中的内容,而无需将该文件放在同一目录中。换句话说,您根本不需要myProject/Server/MyUtilities.java
,无论是作为副本还是作为符号链接;只需参考myProject/Common/MyUtilities.java
中的myProject/Server/ServerFoo.java
。
这更有意义吗?
答案 3 :(得分:1)
如果存储库中的文件重复,则不会占用任何额外空间。这是因为git的存储是一个内容可寻址系统(即该重复文件的相同哈希)。
如果您不希望工作副本占用额外空间,请使用符号链接。 Git可以在Unix系统中保留符号链接,但目前还不支持Windows中的符号链接。