在 IntelliJ IDEA 中正确处理版本控制下的依赖关系
Proper handling of dependencies under Version Control in IntelliJ IDEA
我正在使用 IntelliJ IDE社区版 2016.1。
我已将我的项目放在 Git 下,并将其托管在 GitHub.
我在处理存储库之间的模块依赖性时遇到问题。
配置特定 JAR 的路径时,这些路径因平台而异。例如,在我的 Windows 7 机器上,它们存储在 D:\Lib
,而在我的 Windows 10 机器上,它们位于 C:\IdeaDependencies
.
问题是如果我选择同步模块 IML 文件,路径在每个平台上都是相同的,这不会让 IDE 找到它们。
我该如何解决这个问题?
在您的项目中使用依赖项作为子模块,这样您就不必关心它们在磁盘上的位置。
Submodules
allow foreign repositories to be embedded within a dedicated subdirectory of the source tree, always pointed at a particular commit.
git submodule
像目前一样将您的大项目分解为子项目。
现在使用以下方法将每个子项目添加到主项目中:
git submodule add <url>
将项目添加到您的存储库后,您必须对其进行初始化和更新。
git submodule init
git submodule update
自 Git 1.8.2 添加了新选项 --remote
:
git submodule update --remote --merge
这将fetch
每个子模块中来自上游的最新更改,merge them in
和check out
子模块的最新版本。
正如the docs描述的那样:
--remote
This option is only valid for the update command. Instead of using the superproject’s recorded SHA-1 to update the submodule, use the status of the submodule’s remote-tracking branch.
这相当于每个子模块中的 运行 git pull
。
However, how would I push a commit in the scenario of bug fix in C which affects the code shared with the parent layers?
再次声明:使用子模块会将您的代码作为其内容的一部分放入主项目中。将其放在本地文件夹内或将其作为子模块的一部分之间的区别在于,在子模块中,内容被管理(提交)到不同的独立存储库。
这是子模块的图示 - 另一个项目中的项目,其中每个项目都是一个独立的项目:
git subtree
它允许您插入任何存储库作为另一个存储库的子目录。
与 submodule
非常相似,但主要区别在于代码的管理位置。在子模块中,内容被放置在一个单独的 repo 中并在那里进行管理,这使您也可以将其克隆到许多其他 repo。
subtree
将内容作为根项目的一部分进行管理,而不是在单独的项目中。
与其写下如何设置它和了解如何使用它,您可以简单地阅读 this excellent post,这将解释所有内容。
如果您正在寻找一个简单的解决方案,请将您的依赖项与您的项目文件一起存储,就像任何其他资源一样。
您可以在模块的内容根目录下创建一个名为 lib
的 excluded 文件夹,并使用它来存储您的库。这样,它们的路径将相对于您的项目文件夹(例如 file://$PROJECT_DIR$/lib/gson-2.6.2.jar
),并且您不必为每个平台调整它们。
我正在使用 IntelliJ IDE社区版 2016.1。 我已将我的项目放在 Git 下,并将其托管在 GitHub.
我在处理存储库之间的模块依赖性时遇到问题。
配置特定 JAR 的路径时,这些路径因平台而异。例如,在我的 Windows 7 机器上,它们存储在 D:\Lib
,而在我的 Windows 10 机器上,它们位于 C:\IdeaDependencies
.
问题是如果我选择同步模块 IML 文件,路径在每个平台上都是相同的,这不会让 IDE 找到它们。
我该如何解决这个问题?
在您的项目中使用依赖项作为子模块,这样您就不必关心它们在磁盘上的位置。
Submodules
allow foreign repositories to be embedded within a dedicated subdirectory of the source tree, always pointed at a particular commit.
git submodule
像目前一样将您的大项目分解为子项目。
现在使用以下方法将每个子项目添加到主项目中:
git submodule add <url>
将项目添加到您的存储库后,您必须对其进行初始化和更新。
git submodule init
git submodule update
自 Git 1.8.2 添加了新选项 --remote
:
git submodule update --remote --merge
这将fetch
每个子模块中来自上游的最新更改,merge them in
和check out
子模块的最新版本。
正如the docs描述的那样:
--remote
This option is only valid for the update command. Instead of using the superproject’s recorded SHA-1 to update the submodule, use the status of the submodule’s remote-tracking branch.
这相当于每个子模块中的 运行 git pull
。
However, how would I push a commit in the scenario of bug fix in C which affects the code shared with the parent layers?
再次声明:使用子模块会将您的代码作为其内容的一部分放入主项目中。将其放在本地文件夹内或将其作为子模块的一部分之间的区别在于,在子模块中,内容被管理(提交)到不同的独立存储库。
这是子模块的图示 - 另一个项目中的项目,其中每个项目都是一个独立的项目:
git subtree
它允许您插入任何存储库作为另一个存储库的子目录。
与 submodule
非常相似,但主要区别在于代码的管理位置。在子模块中,内容被放置在一个单独的 repo 中并在那里进行管理,这使您也可以将其克隆到许多其他 repo。
subtree
将内容作为根项目的一部分进行管理,而不是在单独的项目中。
与其写下如何设置它和了解如何使用它,您可以简单地阅读 this excellent post,这将解释所有内容。
如果您正在寻找一个简单的解决方案,请将您的依赖项与您的项目文件一起存储,就像任何其他资源一样。
您可以在模块的内容根目录下创建一个名为 lib
的 excluded 文件夹,并使用它来存储您的库。这样,它们的路径将相对于您的项目文件夹(例如 file://$PROJECT_DIR$/lib/gson-2.6.2.jar
),并且您不必为每个平台调整它们。